Meu código está bifurcando um processo e imprimindo o PID e PPID de cada processo. Eu esperava que o PPID da criança fosse igual ao PID dos pais, mas não está aparecendo como tal.
Estou usando o Ubuntu 14.04.
#include <stdio.h>
#include <sys/wait.h>
int main(){
int pid;
pid = fork();
if(pid==0){
printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid());
}
else
printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid());
return 0;
}
Aqui está a saída que estou obtendo:
I am the parent and my pid is 29229 and my parent id is 27087
I am the child and my parent id is 1135 and my id is 29230
Responder1
Meu palpite é: o pai voltou antes do filho, que ficou órfão. O PID 1135 deve ser o processo de inicialização do usuário, que se tornou o novo pai do processo. (existem 2 subreapers em uma sessão de usuário do Ubuntu).
$ ps -ef | grep init
you 1135 ... init --user
Se você quiser que seu pai espere pelo filho, use wait
. Na verdade, você include
já tem:
#include <stdio.h>
#include <sys/wait.h>
int main(){
int pid;
pid = fork();
if(pid == 0)
printf("\nI am the child and my parent id is - %d and mine id %d\n",getppid(),getpid());
else{
printf("\nI am the parent and my pid is %d and my parent id is %d\n",getpid(),getppid());
wait(NULL);
}
return 0;
}
Isso garantirá que o pai não saia antes do filho printf
. Você pode ver esse comportamento mais claramente inserindo algumas sleep()
chamadas aqui e ali para ver em que ordem as coisas ocorrem.
Para mais informações sobre subreapers,dê uma olhada aqui.