c - 该程序的输出

标签 c error-handling signals

这个计划的方向是什么?我很难关注x

int x = 10;

void handler(sig) {

    x += 7;
    return;

}

int main(int argc, const char* argv[]) {

    int pid;
    signal(SIGCHLD, handler); 
    if ((pid = fork()) == 0) {
        x -= 3;
        exit(0); 
    }
    waitpid(pid, NULL, 0); 
    printf("x = %d\n", x); 
    exit(0);

}

最佳答案

What direction does this program take? I'm having a hard time following x.

为了说明这里发生的情况,我们可以添加另一个对 printf() 的调用,子进程在其中执行:

int pid;
signal(SIGCHLD, handler); 
if ((pid = fork()) == 0) {
    x -= 3;
    printf("x = %d\n", x); 
    exit(0); 
}

该程序内部发生了什么,一步一步:

您设置信号处理程序以在子进程结束时执行:signal(SIGCHLD, handler)

通过编写 if ((pid = fork()) == 0),您将执行 if 下的部分作为子代的代码(当您将 fork 结果与 0 进行比较时)。此外, fork 进程继承了10的值,当我们执行子进程的代码时,它等于10。然后我们从 10 中减去 3:

int pid;
signal(SIGCHLD, handler); 
if ((pid = fork()) == 0) {
    x -= 3;
    printf("x = %d\n", x); 
    exit(0); 
}

但是它只发生在子进程中,因此当您执行代码的最后一部分时:

waitpid(pid, NULL, 0); 
printf("x = %d\n", x); 

然后处理程序正在执行(在父进程中),因此将 7 添加到 10(父进程中 x 的值)。这就是为什么最后你得到 17

关于c - 该程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30043729/

相关文章:

c - 执行默认信号处理程序

c - 当进程仍在运行时如何重新启动处理

c - 由于 .h 上的 "preprocessor define"重新编译

C++ Boost io 流,错误处理

c - 关于在多线程环境中捕获 SIGSEGV

java - 虚方法错误和NullPointerException错误

file - 将fread与std::vector一起使用时出错

C - 程序结构(避免全局变量、包含等)

c - Galois LFSR - 如何指定输出位数

c - Step Into 在 Eclipse CDT 中不起作用