Salut les C,
je n'arrive pas a contrôler les processus créer avec un|des appels a fork(),
Le problème réside dans l'arrêt des processus et de reprise de contrôle par le processus parent.
Je suppose, a tord, que si je lance un nouveau processus (dans un bloque conditionnel):
et que celui ci exécute son code puis retourne, le processus parent reprend le contrôle et le processus fils est arrêter, seulement d'après mes expérience ce n'est pas le cas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if ((child_pid=fork()) != -1) { //le processus fils exécute son code puis retourne return 0 ; }
le processus parent ne reprend pas le contrôle et si je termine pas le processus fils le code est exécuter doublement (vérifiable par un appel a printf() exécuter plusieurs fois).
Prenons l'exemple suivant (que j'espère que vous ne jugerai pas immoral et que vous prendrez avec humours) afin que vous puissiez me guider:
Je comprend parfaitement que le code est exécuter plusieurs fois si il y a plusieurs processus mais pas pourquoi le processus père ne reprends pas le contrôle.
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <time.h> #include <signal.h> int main() { pid_t child_1,child_2 ; pid_t master ; int waiting ; time_t randseed ; time(&randseed) ; srand(randseed/8) ; waiting=rand() % 15 ; time_t wait_time_start ; time_t wait_time_end ; int waiting_time ; char *child_2_say="child_2 say: "; char *child_1_say="child_1 say: "; int c ; master=getpid() ; c=0 ; printf("master pid: %i\n",master) ; fork() ; child_1=getpid() ; fork() ; child_2=getpid() ; time(&wait_time_start) ; while ( c < waiting) { if ( getpid() == child_1 && (c == waiting-2 || c == waiting-1) ) { /* kill() ou return au choix pour finir le processuss */ printf("child_1 killed\n") ; kill(child_1,SIGTERM) ; //return 0 ; } else if ( getpid() == child_2 && (c == waiting-2 || c == waiting-1) ) { /* kill() ou return au choix pour finir le processuss */ printf("child_2 killed\n") ; kill(child_2,SIGTERM) ; //return 0 ; } else if (getpid() == child_1) { time(&randseed) ; srand(randseed/8) ; sleep(rand() % waiting) ; printf("%s i wait %i seconds\n",child_1_say,rand() % waiting) ; } else if (getpid() == child_2) { time(&randseed) ; srand(randseed/8) ; sleep(rand() % waiting) ; printf("%s i wait %i seconds\n",child_2_say,rand() % waiting) ; } sleep(1) ; c++ ; } /* cette partie n'est jamais exécuter * a moins d'enlever les appels a kill() et|ou return: * dans ce cas elle est exécuter 4 fois (voir appel a printf()) */ time(&wait_time_end) ; waiting_time=difftime(wait_time_end,wait_time_start) ; printf("We have wait %i seconds\n",waiting_time) ; return 0 ; }
J'ai essayer avec la fonction waitpid() sans succès.
Je sais que le sujet n'est pas facile et je vous serai grandement reconnaissant de bien vouloir me donner des conseils afin d'éclairer mon ignorance sur le sujet.
J'attends vos réponses éclairées avec impatience.
Partager