2012-02-05 16 views
9

Ese es mi código.Cómo tenedor() n niño procesa correctamente en C?

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

int main (int argc, char *argv[]) 
{ 
    int i, pid; 

for(i = 0; i < atoi(argv[1]); i++) { 
    pid = fork(); 
    if(pid < 0) { 
     printf("Error"); 
     exit(1); 
    } else if (pid == 0) { 
     printf("Child (%d): %d\n", i + 1, getpid()); 
     exit(0); 
    } else { 
     wait(NULL); 
    } 
} 

} 

La salida es así.

Child (1): 5676 
Child (2): 4624 
Child (3): 4800 
Child (4): 5596 
Child (5): 5580 

Sin embargo, esa no es la salida esperada en mi tarea. Debería ser así. ¿Qué pasa con el código? ¿Alguien me puede ayudar?

Child (2): 4625 
Child (1): 4624 
Child (3): 4626 
Child (4): 4627 
Child (5): 4628 

Gracias por su ayuda. Ahora lo probaré.

P.S. Perdón mi ingles es malo. Espero que entiendas lo que dije.

Respuesta

3

Tu código funciona perfectamente en mi computadora. Puede ser dependiente del os

Sin embargo, debe comprobar si argc no es igual a 1 para evitar la segmentación de la falla si no se proporcionan argumentos a su programa.

+0

Gracias por su sugerencia. –

+0

Sí, realmente depende del os. Probé mi programa en el servidor Linux de la escuela. Obtuve el resultado esperado. Muchas gracias. –

1

El sistema toma PID gratuitos para asignar a los procesos. Puede bifurcar el proceso ID'd 4000 y tener un hijo identificado con 3900. El trabajo de tarea no debería incluir números, porque la identificación del primer proceso nunca es igual.

+0

Gracias. Proporcioné una descripción del programa que incluía en mi tarea. Por favor ayuda. –

1

La razón por la que obtiene un resultado no ordenado es que no puede pronosticar exactamente qué hijo se activa cuando. Por lo tanto, puede suceder que la ejecución de su primer hijo se retrase hasta que su segundo hijo sea fork() ed y se inicie.

Sus hijos normalmente obtienen PID secuenciales, aunque esto depende del sistema operativo.

Ambos problemas no deberían ser un problema con su tarea programada, ni los PID absolutos son realmente importantes (como se dijo, cada SO puede hacer sus cosas, asignar PID secuencialmente o al azar), ni el orden en el que los niños hacen lo suyo: cada parte del niño puede tener diferentes tiempos de ejecución, lo que da como resultado un resultado no ordenado. Esto cuenta siempre que los datos se transfieran correctamente, que es el caso si el padre genera la secuencia y luego se bifurca. En este caso, el diseño de la memoria del proceso secundario es el mismo que el de los padres en el momento del tenedor. Entonces el padre puede modificar su "matriz de transferencia de datos" sin afectar a los niños que ya están ejecutándose.

Para reducir la confusión, puede eliminar la salida de PID en cada línea. Tal vez se puedan generar en el respectivo inicio del proceso secundario, pero después de eso, debería ser suficiente para decir, p. Child 3: straight length 6 <S6,H5,C4,S3,H2,SA> sin repetir el PID.

+0

Gracias. Proporcioné una descripción del programa que incluía en mi tarea. Por favor ayuda. –

+1

La asignación de pid no solo depende del sistema operativo, la programación de los procesos secundarios depende del tiempo de ejecución; no hay una garantía sólida de que el primer hijo bifurcado sea el primer hijo programado para ejecutarse. – tbert

+0

@tbert Exactl eso es lo que quiero decir con la "primera" sección de mi respuesta, la que menciona el pronóstico. – glglgl

1

Con esa salida esperada, lo más probable es que su tarea primero deba desviar todos los procesos y luego llamar a esperar.

puede omitir la llamada de espera en el circuito y hacer una separada por debajo que en caso de bucle hasta que vuelve wait-1 y errno conjunto de ECHILD. Tenga en cuenta que el orden de salida de los niños será aleatorio, o al menos no completamente en orden, por lo que no necesariamente 2 1 3 4 5.

Esto es sólo una suposición, debe proporcionar más información si desea una respuesta específica.

+0

Gracias. Proporcioné una descripción del programa que incluía en mi tarea. Por favor ayuda. –