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:
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);
}
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
 
#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;
}
Si quelqu'un pouvait m'éviter de finir chauve aujourd'hui a force de m'arracher les cheveux, j'apprécierais