该计划采取什么方向?我很难跟上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);
}
答案 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
。