ID de proceso principal inesperado en la salida

ID de proceso principal inesperado en la salida

Mi código bifurca un proceso e imprime el PID y PPID de cada proceso. Esperaba que el PPID del niño fuera el mismo que el PID de los padres, pero no aparece como tal.

Estoy usando 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;
}

Aquí está el resultado que obtengo:

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

Respuesta1

Mi conjetura es: el padre regresó antes que el niño, que quedó huérfano. El PID 1135 debe ser el proceso de inicio de usuario, que se convirtió en el nuevo padre del proceso. (Hay 2 subreapers en una sesión de usuario de Ubuntu).

$ ps -ef | grep init
you    1135    ...    init --user

Si desea que sus padres esperen a su hijo, use wait. De hecho ya tienes include:

#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;
}

Esto asegurará que el padre no salga antes que el niño printf. Puede ver este comportamiento más claramente insertando algunas sleep()llamadas aquí y allá para ver en qué orden ocurren las cosas.

Para obtener más información sobre los subreapers,echa un vistazo aquí.

información relacionada