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
?你懂信号吗?等等。哪些部分你不懂。