Bonjour
je cherche la solution a cet exercice SVP! j'ai beau essayé mais sans résultat
Merci
Bonjour
je cherche la solution a cet exercice SVP! j'ai beau essayé mais sans résultat
Merci
Nous ne ferons pas ton travail à ta place.
Montres-nous ce que tu as fait et dis-nous ce que tu ne comprends pas et nous t'aiderons.
Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
Mon article sur le P2V, mon article sur le cloud
Consultez nos FAQ : Windows, Linux, Virtualisation
Voici le programme !!!
Code C : 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 <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <signal.h> #include <sys/wait.h> pid_t pid_fils; pid_t pid_pere; int i=0; void attenteUSR1(int sig){ kill(pid_fils, 12); printf("Pere --> Fils : 12\n"); sleep(2); kill(pid_fils, 12); printf("Pere --> Fils : 12\n"); } void attenteUSR2(int sig){ signal(SIGUSR2,SIG_DFL); } //-----------------------------------------------------------------Functions----------------------------------------------------------------------- pid_t nouveau_process(void) { pid_t pid; pid = fork(); return pid; } void pere(pid_t pid_fils) { while(1){ signal(SIGUSR1, attenteUSR1); } } void fils(void) { printf("Fils --> Pere : 10\n"); kill(getppid(), 10); while(1){ signal(SIGUSR2, attenteUSR2); } } //-----------------------------------------------------------------Main--------------------------------------------------------------------------- int main(void) { pid_t pid = nouveau_process(); pid_fils=pid; printf("Pere main : %d\n",pid_pere); printf("Fils main : %d\n",pid_fils); switch (pid) { case -1: return EXIT_FAILURE; break; case 0: pid_fils=getpid(); printf("Pere fils : %d\n",pid_pere); printf("Fils fils : %d\n",pid_fils); fils(); break; default: pid_pere=getpid(); printf("Pere pere : %d\n",pid_pere); printf("Fils pere : %d\n",pid_fils); pere(pid); break; } return EXIT_SUCCESS
ligne 59, tu imprimes pid_pere alors que la variable n'est pas initialisée.
D'après ton schéma, tu dois gérer les signaux, je ne vois aucune trace de cela.
Regardes ça :
http://mtodorovic.developpez.com/lin...e/?page=page_3
Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
Mon article sur le P2V, mon article sur le cloud
Consultez nos FAQ : Windows, Linux, Virtualisation
salut,
j'ajouterai que ton switch(pid) n'est peut-être pas une bonne idée, à la fin tu peux y perdre en lisibilité
bon comme ça ça m'exerce, j'avais pas fait de C depuis longtemps :
Code C : 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 #include <unistd.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> #ifdef DEBUG #include <stdio.h> #define DBG(...) fprintf(stderr, __VA_ARGS__) #else #define DBG(...) #endif pid_t pid; int sigcount = 0; void handleSignals (int sig) { sigcount++; DBG("%s : signal %s reçu\n", (pid)?"PERE":"FILS", (sig==SIGUSR1)?"SIGUSR1":"SIGUSR2"); } int main (void) { pid = fork(); if (pid < 0) { DBG("échec fork()\n, exiting."); return -1; } if (pid == 0) { /* on est dans le fils */ DBG("FILS : je suis vivant !\n"); signal(SIGUSR2, handleSignals); DBG("FILS : envoie du signal SIGUSR1 au processus père\n"); kill(getppid(), SIGUSR1); while(sigcount < 2); DBG("FILS : les deux signaux ont été reçu, on quitte\n"); } else { /* on est dans le père */ DBG("PERE : présent !\n"); signal(SIGUSR1, handleSignals); while(sigcount < 1); DBG("PERE : envoie du premier signal\n"); kill(pid, SIGUSR2); DBG("PERE : on attend 1sec, le temps que le fils récupère le signal\n"); sleep(1); DBG("PERE : envoie du second signal\n"); kill(pid, SIGUSR2); DBG("PERE : en attente du fils pour quitter\n"); wait(NULL); DBG("PERE : on quitte\n"); } DBG("%s : fin normale du processus\n", (pid)?"PERE":"FILS"); return 0; }
c'est une façon parmi d'autres de faire, la plus simple
et le résultat :
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 $ gcc -Wall -DDEBUG pouet.c -o pouet && ./pouet PERE : présent ! FILS : je suis vivant ! FILS : envoie du signal SIGUSR1 au processus père PERE : signal SIGUSR1 reçu PERE : envoie du premier signal PERE : on attend 1sec, le temps que le fils récupère le signal FILS : signal SIGUSR2 reçu PERE : envoie du second signal PERE : en attente du fils pour quitter FILS : signal SIGUSR2 reçu FILS : les deux signaux ont été reçu, on quitte FILS : fin normale du processus PERE : on quitte PERE : fin normale du processus
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager