Предупреждение, в
pid1 = fork();
printf("Pid1 pid -> %d ppid -> %d\n",getpid(),getppid());
printf выполняется как в P0, так и в P1, это вообще неясно, вы должны сначала проверить pid1 перед чтобы напечатать, где вы находитесь.
Предупреждение, в
pid1 = fork();
...
if(pid1 != 0)
{
pid2 = fork();
вы должны быть в P1, когда вы снова fork , но вы все еще в P0, потому что pid1 не равен 0
Также рекомендуется проверить fork success (возвращаемое значение не равно -1) и дождаться ребенка (ren ) завершение, а не выход из родительского процесса до
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int pid1 = fork();
if (pid1 == -1)
perror("cannot fork p1");
else if(pid1 != 0)
{
int pid2;
printf("In P1, Pid1 pid -> %d ppid -> %d\n", getpid(), getppid());
pid2 = fork();
if (pid2 == -1)
perror("cannot fork p2");
else if (pid2 == 0) {
int pid3[2];
int i;
printf("in P2, Pid2 pid -> %d ppid -> %d\n", getpid(), getppid());
for (i = 0; i != 2; ++i) {
pid3[i] = fork();
if (pid3[i] == -1)
perror("cannot fork P2 child");
else if (pid3[i] == 0) {
printf("in Child %d pid -> %d Parent -> %d\n",i+1,getpid(),getppid());
return 0;
}
else
puts("in p2");
}
waitpid(pid3[0], 0, 0); /* erroned if fork failed, whatever */
waitpid(pid3[1], 0, 0); /* erroned if fork failed, whatever */
}
else {
puts("still in p1");
waitpid(pid2, 0, 0);
}
}
else
{
puts("in P0");
waitpid(pid1, 0, 0);
}
return 0;
}
Компиляция и выполнение:
/tmp % ./a.out
In P1, Pid1 pid -> 68995 ppid -> 54669
in P0
still in p1
in P2, Pid2 pid -> 68997 ppid -> 68995
in p2
Child 1 pid -> 68998 Parent -> 68997
in p2
Child 2 pid -> 68999 Parent -> 68997
/tmp %
Обратите внимание, что записанный pid неверен, из руководства getppid :
тогда вызов getpid () в дочернем элементе вернет неправильное значение (точнее: вернет PID родительского процесса)