Soit le code suivant :
Quand on fait un fork, on fait une copie et donc ma question est : est-ce que le fils peut faire un fork lui aussi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> int main(void) { pid_t pid; if((pid = fork()) == -1) { fprintf(stderr,"Echec de fork erreur numéro %d.\n", errno) ; exit(1) ; } if(pid == 0) printf(" Cet affichage est réalisé par le fiston.\n"); else printf("Cet affichage est réalisé par le papa.\n"); }
Ca m'embrouille :s parce que le fils execute cette instruction if((pid = fork()) == -1) non?
En fait si je pose cette question c'est parce que mon programme a un comportement bizarre : son but est de créer un nombre donné en argument de fork; Puis chaque fork affiche son pid et attend deux secondes. Pendant ce temps le pere attend la mort des fork et affiche le pid d'un fork une fois celui ci mort.
Avec 1 en argument le comportement est correct, avec 2 voici ci dessous le résultat, avec 3 c'est encore pire..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <errno.h> #include <time.h> int main(int argc, char * argv[]) { unsigned nbFolk; // Nombre de fois que le programme doit se cloner pid_t pid; pid_t pidFilsMort; int err; unsigned i; if (argc < 2) { fprintf(stderr, "Lancer le programme avec un argument\n"); exit(EXIT_FAILURE); } else { err = sscanf(argv[1], "%d", &nbFolk); if (err < 1) { fprintf(stderr, "Erreur survenu sur l'argument\n"); printf("Verifier que l'argument soit correct :\n"); printf("Usage : nombre entier\n"); exit(EXIT_FAILURE); } if (err == EOF) { perror("Erreur survenu sur l'argument : "); exit(EXIT_FAILURE); } for (i = 0; i < nbFolk; i++) { if((pid = fork()) == -1) { fprintf(stderr, "Erreur de fork %d", errno); exit(EXIT_FAILURE); } } switch (pid) { case 0 : printf("PID = %ld\n", (long) getpid()); sleep(nbFolk * 2); break; default : while ((pidFilsMort = wait(NULL)) != -1) printf("\nPID du fils mort : %ld\n", (long) pidFilsMort); } } return EXIT_SUCCESS; }
sinan@sinux:~$ ./test 2
PID = 9429
PID = 9430
PID du fils mort : 9429
PID du fils mort : 9428
PID du fils mort : 9430
Partager