这不是代码审查,因为我不了解代码的完整概念。如果仍然应该移动,请告诉我。
我有一些代码,我想解释一下我的想法,我希望有人可以告诉我我哪里出错或者感到困惑,因为我仍然不完全确定发生了什么。
#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;
}
据我所知,我们有两个进程ID,父进程(pid)和子进程(pid1)。
一旦我调用pid = fork()
,我相信孩子被启动并被赋予id为0,而父母得到了孩子的ID,比如1337.所以pid = 1337,pid1 = 0
所以我们跳过第一个if
因为没有发生错误(pid&lt; 0),我们跳过第二个if
因为pid不等于0,然后我们进入最后{ {1}}其中C将打印1337,D将打印0。
然后等到孩子完成,我想。
之后,我假设复制的进程(fork())将运行if
,但我对原因感到困惑,因为pid仍然是1337 ..
TLDR:如果第一个else if (pid == 0)
应该先执行,那么我该如何进入第二个if
,但如果这个逻辑完全错误,请纠正我。
答案 0 :(得分:5)
fork创建了一个(近乎完美的)正在运行的进程的副本。正如您所推测的那样,一个区别是fork()
本身的返回值。因此,假设fork工作,您有两个进程执行相同的代码。一个是孩子,它采用if (pid == 0) ...
路径,而父路径采用else...
路径。您没有关于这两个进程的工作顺序的信息。也许孩子先走,也许是父母,可能是他们轮流的一半,也许你有两个处理器,他们一起跑...
想象一下,你将这个程序写在一张纸上,然后用手指跟着它,将它滑到页面上。当你到达前叉时,将纸张拿到复印机上,复印一份,将两张纸放在桌子上,用一只手上的食指放在其中一块上,然后移动你的两根手指,每一根滑下来自己的纸张。
答案 1 :(得分:4)
你说的一切都不正确
执行fork()调用之后,子进程和父进程并行运行,两者都执行fork()之后的程序代码。唯一的区别是pid。子进程将使用pid = 0运行相同的程序,并且父进程将使用pid =(子进程的pid)运行相同的程序。它们分开,既有程序的所有变量的副本,又有pid变量的不同副本。
答案 2 :(得分:1)
pid
为0,父项中的子进程ID为
pid1
设置为当前进程的进程ID。子项pid1
副本中的值与父项pid
副本的值相同。