2017-02-22 1 views
1

J'écris un programme qui crée deux processus directement à partir du parent. Mon résultat attendu ressembleC Création d'un processus enfant

Main programs process ID: 2834 
Child 2 (ID: 2836) Start Sequence at: 23 
Child 1 (ID: 2835) Start Sequence at: 20 

Ma sortie réelle est

Main programs process ID: 2834 
Child 2 (ID: 2834) Start Sequence at: 23 
Child 1 (ID: 2835) Start Sequence at: 20 

Mon code est

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

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

    if (argc == 1) { 
     fprintf(stderr,"Usage: ./a.out <starting value>\n"); 
     return -1; 
    } 
    n = atoi(argv[1]); 

    int p_pid; 
    p_pid = getpid(); 

    printf("Main programs process ID: %d\n", p_pid); 

    pid = fork(); 

    if(pid == 0){ 
     int c1; 
     c1 = getpid(); 
     printf("Child 1 (ID: %d) Start Sequence at: %d\n", c1, n); 
    } 

    if(pid != 0){ 
     int c2; 
     c2 = getpid(); 
     printf("Child 2 (ID: %d) Start Sequence at: %d\n", c2, n+3); 
    } 
    return 0; 
} 

Je reçois le processus enfant 1 correct, mais pas le processus enfant 2 correct. Qu'est-ce que je fais de mal ou comment puis-je résoudre ce problème?

+0

Le code n'a qu'un seul appel à 'fork()' pour qu'un seul enfant soit créé. – user3629249

+0

NOTE: la fonction: 'fork()' a trois (3) types de valeurs de retour. Le code affiché vérifie uniquement le retour '== 0' et suppose qu'aucune erreur ne s'est produite. C'est une très mauvaise pratique de programmation de ne pas vérifier les erreurs. – user3629249

+0

le processus principal (le parent) ne devrait pas retourner jusqu'à ce que tous les enfants aient quitté. Par conséquent, le parent doit appeler 'wait()' ou mieux 'waitpid()' pour chaque enfant avant la sortie du parent. – user3629249

Répondre

4

fork() ne crée pas 2 nouveaux processus. Il engendre 1 enfant du processus principal. Il renvoie 0 dans le processus fils et le PID de l'enfant si vous êtes dans le parent. Donc, dans votre code, quand vous pensez que vous êtes dans l'enfant 2 - c'est toujours le parent. Vous devrez appeler à nouveau fork(), mais uniquement dans le processus parent.

+0

s'il vous plaît voir mes commentaires sur la question en ce qui concerne d'autres problèmes avec le code affiché – user3629249