这个程序的输出

Output of this program

这个项目的方向是什么?我很难跟上 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 进行比较时)。此外,forked 进程继承了 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.