2011-09-01 45 views
5

Estoy tratando de crear un programa que use fork() para crear un nuevo proceso. La salida de muestra debería verse así:fork() procesos secundarios y secundarios

Este es el proceso hijo. Mi pid es 733 y el ID de mi padre es 772.
Este es el proceso principal. Mi pid es 772 y la identificación de mi hijo es 773.

Así es como me programé mi programa:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), fork()); 

    return 0; 
} 

Esto da lugar a la salida:

Este es el proceso hijo. Mi pid es 22163 y el ID de mi padre es 0.
Este es el proceso hijo. Mi pid es 22162 y el ID de mi padre es 22163.

¿Por qué está imprimiendo la declaración dos veces y cómo puedo mostrarla correctamente después de que aparezca la identificación del niño en la primera oración?

EDIT:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
int pid = fork(); 

if (pid == 0) { 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid()); 
} 
else { 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid); 
} 

return 0; 
} 
+2

Su programa no intenta imprimir las palabras "proceso primario" en ninguna parte. No están presentes en el texto del programa, ¿por qué espera que se impriman? –

+3

'hombre tenedor '. Léelo. Comprende las palabras. Vaya a StackOverflow cuando no tenga ningún medio para encontrar la respuesta usted mismo. Serás un mejor programador para esta experiencia. – asveikau

+2

Además, 'fork' no devuelve una identificación de proceso principal al elemento secundario. Devuelve 0 al hijo y el ID del hijo al padre. Así es como sabes cuál es cuál. –

Respuesta

9

Comience leyendo las páginas del manual fork man page y getppid/getpid.

de

En caso de éxito tenedor, el PID del proceso hijo se devuelve en hilo de los padres de la ejecución, y se devuelve un 0 en la rosca de ejecución del niño. En caso de falla, se devolverá -1 en el contexto del padre, , no se creará ningún proceso hijo, y se establecerá errno apropiadamente.

Así que esto debe ser algo por las líneas de

if ((pid=fork())==0){ 
    printf("yada yada %u and yada yada %u",getpid(),getppid()); 
} 
else{ /* avoids error checking*/ 
    printf("Dont yada yada me, im your parent with pid %u ", getpid()); 
} 

cuanto a su pregunta:

Este es el proceso hijo. Mi pid es 22163 y el ID de mi padre es 0.

Este es el proceso hijo. Mi pid es 22162 y el ID de mi padre es 22163.

fork() ejecuta antes de la printf. Entonces cuando está hecho, tienes dos procesos con las mismas instrucciones para ejecutar. Por lo tanto, printf se ejecutará dos veces. La llamada al fork() devolverá 0 al proceso secundario, y el pid del proceso secundario al proceso principal.

Te dan dos procesos en ejecución, cada uno va a ejecutar este instrucción declaración:

printf ("... My pid is %d and my parent's id is %d",getpid(),0); 

y

printf ("... My pid is %d and my parent's id is %d",getpid(),22163); 

~

Para envolverlo, la línea anterior es el niño, especificando su pid. La segunda línea es el proceso principal, especificando su id (22162) y su hijo (22163).

+0

Y se imprime dos veces porque ... (del hombre de la horquilla): Después de que se crea un nuevo proceso secundario, ambos procesos ejecutarán la siguiente instrucción siguiendo la llamada al sistema fork(). Por lo tanto, tenemos que distinguir el padre del niño. Esto se puede hacer probando el valor devuelto de fork() – Icarus

+0

Muchas gracias, este fue un GRAN colapso. Edité mi código revisado arriba. Parece que funciona correctamente. ¿Te importaría revisar dos veces para ver si mi lógica es correcta? – raphnguyen

+0

@raphnguyen Todos deberían llamar a 'getppid()' para obtener el id. De proceso de sus padres. En su ejemplo, el proceso principal imprimirá su id. De proceso secundario en su lugar. – Tom

0

Se imprime dos veces porque se está llamando printf dos veces, una vez en la ejecución de su programa y una vez en el tenedor. Intente sacar su tenedor() de la llamada de impresión.

2

Está imprimiendo la instrucción dos veces porque la está imprimiendo tanto para el elemento primario como secundario. El padre tiene un ID de padre de 0

intentar algo como esto:

pid_t pid; 
pid = fork(); 
if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(),getppid()); 
else 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), getppid()); 
0

Ésta es la manera correcta para conseguir el resultado correcto .... Sin embargo, jardín de ID de padre tal vez a veces imprime como 1 porque los padres el proceso finaliza y el proceso raíz con pid = 1 controla este proceso huérfano.

pid_t pid; 
pid = fork(); 
if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id 
     is %d.\n", getpid(), getppid()); 
else 
    printf("This is the parent process. My pid is %d and my parent's 
     id is %d.\n", getpid(), pid); 
Cuestiones relacionadas