我无法理解fork()
之后是否有保证。在研究链式流程和粉丝流程时,我陷入了困境。如果我分叉两次,层次结构大致是
它们是代码的条件:
(childpid = fork()) <= 0
如果是孩子或错误,请将其打破。 (粉丝)(childpid = fork()) > 0
如果是父母,请打破它。 (链)对于2个进程的粉丝,显示草图
对于2个过程的链,显示草图
所以我的堆叠点在这里是如何知道哪个父母会破坏?是否保证首先创建第一个父级(前1个)分叉,然后创建另一个父级(左侧1)?例如,风扇情况可以草图吗?为什么? 如果是,则在2个调用fork()的链中创建3个进程。谁是第三个?据我检查,它是孙子。但在这方面,在这种情况下,孙子女是在祖父母的孩子面前创建的。
simplechain.c
/* UNIX Systems Programming: Communication, Concurrency and Threads 2nd
Edition, Kay Robbins and Steven Robbins */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
pid_t childpid = 0;
int i, n;
n = 2;
for (i = 0; i < n; i++)
if (childpid = fork())
break;
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
simplefan.c
/* UNIX Systems Programming: Communication, Concurrency and Threads 2nd
Edition, Kay Robbins and Steven Robbins */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
pid_t childpid = 0;
int i, n;
n = 2;
for (i = 0; i < n; i++)
if ((childpid = fork()) <= 0)
break;
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
答案 0 :(得分:0)
是否保证首先创建第一个父级(前1个)分叉,然后创建其他父级(左侧1)?例如,风扇情况可以草图吗?为什么呢?
第一个父母的孩子是第二个孩子的父母,所以有保证。在我出生之前,我的祖母生下了我的母亲,这是确定无疑的。
总共有3个进程。一个fork()
调用有一个原始进程,它会创建一个子进程。
原始流程调用fork()
; fork()
在父级中返回非零子pid,因此for
循环被破坏。它在子节点中返回0,表示循环继续,并立即计算i = 1
。再次调用fork()
并发生同样的事情:for
循环被中断退出。在子进程中,在i++
之后,i < n
为false并且退出循环。总共fork()
被调用了两次。已经有3个过程:原始过程,它的孩子和它的孙子。代码创建了 2 。