这不是代码审查,因为我不了解代码的完整概念.如果仍然应该移动,请告诉我.
我有一些代码,我想解释一下我的想法,我希望有人可以告诉我我哪里出错或者感到困惑,因为我仍然不完全确定发生了什么.
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid, pid1;
pid = fork();
if (pid < 0) {
fprintf (stderr, “fork() failed\n”);
return(1);
}
else if (pid == 0) {
pid1 = getpid();
printf (“pid = %d\n”, pid); // A
printf (“pid1 = %d\n”, pid1); // B
}
else {
pid1 = getpid();
printf (“pid = %d\n”, pid); // C
printf (“pid1 = %d\n”, pid1); // D
wait (NULL);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我们有两个进程ID,父进程(pid)和子进程(pid1).一旦我打电话pid = fork(),我相信孩子被启动并被赋予id为0,而父母得到了孩子的ID,比如1337.所以pid = 1337,pid1 = 0.
所以我们跳过第一个if没有发生错误(pid <0),我们跳过第二个if,因为pid不等于0,然后我们进入最后if,C将打印1337,D将输出0.
我想,这等到孩子完成了.
在那之后,我假设复制的进程(fork())将运行else if (pid == 0)但我很困惑为什么,因为pid仍然是1337 ..
TLDR:如果第三个if应该先执行,那么我如何到达第二个if,但如果这个逻辑完全错误,请纠正我.
fork创建了一个(近乎完美的)正在运行的进程的副本.正如你所推测的那样,一个区别就是fork()它本身的回报价值.因此,假设fork工作,您有两个进程执行相同的代码.一,孩子,if (pid == 0) ...走路径,而父母走这else...条路.您没有关于这两个进程的工作顺序的信息.也许孩子先走了,也许是父母,可能是他们轮流的一半,也许你有两个处理器,他们一起跑...
想象一下,你将这个程序写在一张纸上,然后用手指跟着它,将它滑到页面上.当你到达前叉时,将纸张拿到复印机上,复印一份,将两张纸放在桌子上,用一只手上的食指放在其中一块上,然后移动你的两根手指,每一根滑下来自己的纸.