这个计划的方向是什么?我很难关注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/