我正在做一些自学的C练习,遇到了以下问题:
第一部分:
int main(int argc, char **argv) {
int a = 5, b = 8;
int v;
v = fork();
if(v == 0) {
// 10
a = a + 5;
// 10
b = b + 2;
exit(0);
}
// Parent code
wait(NULL);
printf("Value of v is %d.\n", v); // line a
printf("Sum is %d.\n", a + b); // line b
exit(0);
}
b部分:
int main(int argc, char **argv) {
int a = 5, b = 8;
int v;
v = vfork();
if(v == 0) {
// a = 10
a = a + 5;
// b = 6
b = b - 2;
exit(0);
}
// Parent code
wait(NULL);
printf("Value of v is %d.\n", v); // line a
printf("Sum is %d.\n", a + b); // line b
exit(0);
}
我们必须比较 和 的line a
输出line b
。
a部分的输出是:
Value of v is 79525.
Sum is 13.
b部分的输出是:
Value of v is 79517.
Sum is 16.
它出现在 a 部分中,总和是 and 的初始声明的总和a
,b
而在 b 部分中,总和包括子进程内的总和。
我的问题是 - 为什么会发生这种情况?
根据这篇文章:
两者的基本区别在于,当使用 vfork() 创建新进程时,父进程会暂时挂起,子进程可能会借用父进程的地址空间。这种奇怪的事态一直持续到子进程退出或调用 execve(),此时父进程继续。
父进程的定义暂时中止对我来说没有多大意义。这是否意味着对于1b
,程序在父进程运行之前一直等到子进程完成运行(因此为什么子进程变量被求和)?
问题陈述还假设“由内核维护的父进程的进程ID为2500
,并且新进程是在子进程创建之前由操作系统创建的”。
根据这个定义,这v
两个程序的价值是多少?