我开始学习一些C和在学习叉,等功能,我到了一个意想不到的输出。 至少对于我来说。
有没有什么方法来创建只有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
请忽略管道的一部分,我还没有得到那么远呢。 我只是想,所以我希望3只创建2子进程“我PID ......”父,我将等待和2子进程,将通过管道沟通仅输出1。
让我知道,如果你看到我的错误是。
pid = fork (); #1
pidb = fork (); #2
让我们假设父进程ID为100,第一音叉创建另一个进程101.现在,这两个100&101继续#1之后执行的,所以他们执行第二叉。 PID 100到达#2创建的另一过程102的pid 101到达#2创建的另一过程103。因此,我们最终用4个进程。
你应该做的就是这样的事情。
if(fork()) # parent
if(fork()) #parent
else # child2
else #child1
在创建过程后,您应该检查返回值。 如果你不这样做,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);
}
}
当叉子语句由母公司执行的,正如你所期望创建一个子进程。 可以说,子进程还执行叉语句,但返回0,父,然而,返回的PID。 叉语句后的所有代码由两个执行,家长和孩子。
在你的情况发生了什么事情是,第一叉语句创建一个子进程。 所以目前有一个家长,P1,和一个孩子,C1。
现在,P1和C1都遇到第二个叉声明。 父创建了另一个孩子(C2)如你所期望的,但即使是孩子,C1创建一个子进程(C3)。 所以,实际上你有P1,C1,C2和C3,这就是为什么你有4个print语句输出。
想想一个很好的方法是使用树,代表一个过程中的每个节点,根节点是最高父。
您可以检查值,好像(PID <0)进程创建不成功此告知用户,如果子进程创建不成功。如果GETPID()从父进程使用fork函数返回子进程的进程ID ..
您可以创建一个子进程中的一个子进程。 这样你可以有原始父进程的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!