该计划的输出

时间:2015-05-05 03:23:46

标签: 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);

}

1 个答案:

答案 0 :(得分:0)

  

该计划采取什么方向?我很难过   跟随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下的section作为child的代码(将fork结果与0进行比较)。此外,分叉进程继承10的值,当我们执行子进程的代码时,它等于10。然后我们从3中减去10

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