我开始学习一些C并且在研究fork时,等待函数我得到了意想不到的输出。至少对于我来说。
有没有办法只从父级创建2个子进程?
这是我的代码:
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main ()
{
/* Create the pipe */
int fd [2];
pipe(fd);
pid_t pid;
pid_t pidb;
pid = fork ();
pidb = fork ();
if (pid < 0)
{
printf ("Fork Failed\n");
return -1;
}
else if (pid == 0)
{
//printf("I'm the child\n");
}
else
{
//printf("I'm the parent\n");
}
printf("I'm pid %d\n",getpid());
return 0;
}
这是我的输出:
I'm pid 6763
I'm pid 6765
I'm pid 6764
I'm pid 6766
请忽略管道部分,我还没有那么远。我只是想创建只有2个子进程,所以我希望3“我是pid ......”只输出1个父级,我将等待,2个子进程将通过管道进行通信。
如果你知道我的错误在哪里,请告诉我。
答案 0 :(得分:31)
pid = fork (); #1
pidb = fork (); #2
让我们假设父进程id为100,第一个fork创建另一个进程101.现在100&amp; 101在#1之后继续执行,因此它们执行第二次分叉。 pid 100到达#2创建另一个进程102.pid 101到达#2创建另一个进程103.所以我们最终得到4个进程。
你应该做的就是这样。
if(fork()) # parent
if(fork()) #parent
else # child2
else #child1
答案 1 :(得分:13)
创建流程后,应检查返回值。如果不这样做,则seconde fork()
将由父进程和子进程执行,因此您有四个进程。
如果你想创建2个子进程,只需:
if (pid = fork()) {
if (pid = fork()) {
;
}
}
您可以像这样创建n个子进程:
for (i = 0; i < n; ++i) {
pid = fork();
if (pid > 0) { /* I am the parent, create more children */
continue;
} else if (pid == 0) { /* I am a child, get to work */
break;
} else {
printf("fork error\n");
exit(1);
}
}
答案 2 :(得分:3)
当父级执行fork语句时,会按照您的预期创建子进程。您可以说子进程也执行fork语句但返回0,但父进程返回pid。 fork语句之后的所有代码都由父和两者执行。
在您的情况下,发生的事情是第一个fork语句创建了一个子进程。所以现在有一个父母P1和一个孩子C1。
现在P1和C1都遇到第二个fork语句。父母会按照您的预期创建另一个孩子(c2),但即使是孩子,c1也会创建一个子进程(c3)。所以实际上你有P1,C1,C2和C3,这就是你有4个打印语句输出的原因。
考虑这一点的好方法是使用树,每个节点代表一个进程,根节点是最顶层的父节点。
答案 3 :(得分:0)
您可以将值检查为 if(pid <0) 进程创建失败 这告诉子进程创建是否不成功。 如果从父进程使用getpid(),fork将返回子进程的进程id。
答案 4 :(得分:0)
您可以在子进程中创建子进程。这样,您就可以拥有原始父流程的2个副本。
int main (void) {
pid_t pid, pid2;
int status;
pid = fork();
if (pid == 0) { //child process
pid2 = fork();
int status2;
if (pid2 == 0) { //child of child process
printf("friends!\n");
}
else {
printf("my ");
fflush(stdout);
wait(&status2);
}
}
else { //parent process
printf("Hello ");
fflush(stdout);
wait(&status);
}
return 0;
}
这将打印以下内容:
Hello my friends!