Bonjour,
J'essaie en ce moment de comprendre les interractions entre processus enfants et parents, et plus précisement d'envoyer un signal d'un parent à un enfant.
J'ai récupéré un code sur internet (que j'ai légèrement modifié), mais je me heurte à des erreurs que je n'arrive pas à comprendre.
Le principe du programme est simple, je fais un fork(), et je veux que le parent envoie des signaux séparés de 3 secondes à l'enfant pour lui dire d'écrire un truc dans la console avec printf.
Mon problème est que qu'après avoir compilé une fois, je n'ai pas les mêmes résultats quand j'exécute plusieurs fois d'affilée le programme. Exemple :
(Dsl pour la taille de l'image, mais c'est illisible quand j'essaie de la réduire).
Quand j'exécute la 1ere fois (./test1), j'ai une réponse de l'enfant au premier signal, alors que sans rien changer quand j'exécute la seconde fois (./test2), je n'ai plus aucune réponse au 1er signal)
Mon code est le suivant, j'espère que vous pourrez m'aider :
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 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <sys/wait.h> void banane(); void sigint(); void sigquit(); void sigusr1(); main() { int pid; int k; /* get child process */ if ((pid = fork()) < 0) { perror("fork"); exit(1); } if (pid == 0) { /* child */ k=0; signal(SIGHUP,banane); /* set function calls */ signal(SIGINT,sigint); signal(SIGQUIT,sigquit); signal(SIGUSR1,sigusr1); } else /* parent */ { /* pid hold id of child */ k=2222; printf("\nPARENT: sending SIGUSR1\n\n"); kill(pid,SIGUSR1); sleep(3);/* pause for 3 secs */ printf("\nPARENT: sending SIGHUP\n\n"); kill(pid,SIGHUP); sleep(3); /* pause for 3 secs */ printf("\nPARENT: sending SIGINT\n\n"); kill(pid,SIGINT); sleep(3); /* pause for 3 secs */ printf("\nPARENT: sending SIGQUIT\n\n"); kill(pid,SIGQUIT); sleep(1); } return 0; } void sigusr1() {signal(SIGUSR1,sigusr1); printf("CHILD: I have received a SIGUSR1\n"); } void banane() {signal(SIGHUP,banane); printf("CHILD: I have received a SIGHUP (banane)\n"); } void sigint() {signal(SIGINT,sigint); printf("CHILD: I have received a SIGINT\n"); } void sigquit() { printf("My DADDY has Killed me!!!\n"); exit(0); }
Partager