C 此程序的输出

C 此程序的输出,c,error-handling,signals,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(p

这个项目的方向是什么?我很难跟上
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);

}
这个项目的方向是什么?我的日子不好过 在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

也许你可以编译并执行它?也许你可以更具体地说明你不理解程序的哪一部分。例如,您是否了解
fork
?你懂信号吗?等等。哪些部分你不懂。