Bonjour, j'ai un problème avec la fonction sigqueu.
Voici le contexte:
L'exercice que je réalise me demande de mettre en évidence que les signaux kill() ne sont pas mémorisé au contraire des signaux sigqueue().
Pour ce faire j'utilise deux processus. Un premier qui demande implémente un handler. Ce dernier incrémente une variable et affiche un texte.
Le deuxième processus demande le pid du premier comme paramètre et envoie une série de 10 signals à ce dernier.
Afin de montrer que sigqueue mémorise les signaux envoyé j'envoie les signaux toute les secondes mais le handler lui en prend 2 pour réaliser son opération (simulation avec sleep()).
Le problème étant que je ne reçois pas tout les signaux dans mon handler. Contrairement à ce que je dois prouver...
Le code de mes deux processus:
Processus 1:
Processus 2:
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 #include <stdio.h> #include <sys/types.h> #include <errno.h> #include <signal.h> void handler_signaux(); int nbrsig; int main() { struct sigaction sig_act; nbrsig = 0; int ret_val; sig_act.sa_handler = handler_signaux; sigemptyset(&sig_act.sa_mask); sig_act.sa_flags = SA_SIGINFO; ret_val = sigaction ( SIGUSR1 , &sig_act, NULL ); if ( ret_val == -1 ) perror ( "\n\rMain !!! ERREUR sigaction" ); printf("\nPid: %d\n", getpid()); while(1){ printf("\nNombre de signaux reçus: %d\n", nbrsig); fflush(NULL); pause(); } return 0; } void handler_signaux ( int signal, struct siginfo *siginfo_hdler , int *val ) { int i; //for(i=0; i<10000000; i++){} //heavyload sleep(2); nbrsig++; printf ("\n\rHandler, signal : %d ", signal ); fflush(NULL); }
Si quelqu'un pouvait m'éviter de finir chauve aujourd'hui a force de m'arracher les cheveux, j'apprécierais
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 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <errno.h> #include <signal.h> #include <unistd.h> int main(int argc, char *argv[]) { int i,pid; union sigval sigval_appl ; int ret_val; pid = atoi(argv[1]); sigval_appl.sival_int = 25 ; // envoi avec sigqueue for(i = 0; i < 10; i++) { /* kill(pid,SIGUSR1);*/ printf("Envoie signal %d",i); fflush(NULL); ret_val = sigqueue( pid, SIGUSR1 , sigval_appl ); if ( ret_val == -1 ) perror ( "\n\rMain !!! ERREUR sigqueue" ); sleep(1); } //sleep(10); return 0; }![]()
Partager