c - 理解 C 中的 fork() 顺序
问题描述
所以我有这个程序我试图理解,它来自一个旧的考试,但我无法掌握它。我如何知道分叉的顺序以及变量如何更改?
static int g = -1;
int main(int argc, char *argv[])
{
int v = 0;
pid_t p;
while (v++ < 6)
if ((p = fork()) < 0) {
perror("fork error");
return 1;
} else if (p == 0) {
v++;
g--;
} else {
g++;
v+=3;
if (waitpid(p, NULL, 0) != p) {
perror("waitpid error");
return 1;
}
}
printf("mypid = %d parentpid = %d p = %d v = %d g = %d\n",
getpid(), getppid(), p, v, g);
return 0;
}
解决方案
对 fork 的每次调用都会使用自己的变量生成自己的进程,这些变量在调用时被复制(逻辑上;当实际复制发生时优化可能会改变,但不会改变结果)。
所以当你进入循环时,v 会递增到 1,然后你 fork。此时父进程有 g=-1, v=1, p= 而新子进程有 g=-1, v=1, p=0。然后父级进入 else 情况,将 g 增加到 0 和 v 到 4,然后等待子级完成,而子级进入“else if (p == 0)”,将 v 增加到 2,减少 g到-2,然后再次循环。
从那里开始,您现在希望获得足够的信息来遵循逻辑,因为接下来的两个子进程被分叉,完成循环并打印它们各自的结果。当他们这样做时,第一个孩子也将以 v=6 到达其 waitpid 的末尾,退出循环并打印其结果。
此时,父级将解除阻塞,再绕循环一次(沿途再分叉一个子级),然后(一旦该子级完成)退出循环。
推荐阅读
- c# - Xamarin 形成 WebView 丢失 Session/Cookie
- python - 几个numpy数组到单个熊猫数据帧
- jquery - Laravel Jquery Dependent 下拉菜单显示错误 GET http://localhost:8000/dosen/pengajuan/getKK/4 404 (Not Found)
- r - 如何从字符串中提取一个或多个单词并在两个不同的列中搜索它们形成R中的另一个文件
- javascript - 如何使用javascript从网页中获取点击或选择的文本?
- ansible - 如何让 Ansible 和 Yum 一起工作?
- python-3.x - 在 SOLID 编程中将*序列化*放在哪里
- sql - 如何在 WHERE 子句中用动态日期替换固定日期?
- haskell - 水平顺序 repminPrint
- c++ - 队列竞争条件和线程