这个程序的输出
Output of this program
这个项目的方向是什么?我很难跟上 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
进行比较时)。此外,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
.
这个项目的方向是什么?我很难跟上 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
进行比较时)。此外,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
.