Bonjour,

J'essaye d'utiliser sigsuspend() mais il me semble qu'il a chez moi (noyau darwin) un comportement bizarre… J'ai réduit le problème à un code minimaliste.

Que ce soit avec ce code :
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
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
 
int main(int argc, char *argv[])
{
 
	printf("pid : %d\n", getpid());
 
	sigset_t sig_proc_mask, tmp;
	sigfillset(&sig_proc_mask);
	sigdelset(&sig_proc_mask, SIGTERM);
	sigdelset(&sig_proc_mask, SIGIO);
	sigdelset(&sig_proc_mask, SIGINT);
	sigdelset(&sig_proc_mask, SIGSTOP);
	sigdelset(&sig_proc_mask, SIGKILL);
	sigprocmask(SIG_SETMASK, &sig_proc_mask, &tmp);
 
	sigset_t sig_empty_mask;
	sigemptyset(&sig_empty_mask);
 
	printf("avant\n");
	sigsuspend(&sig_empty_mask);
	printf("après\n");
 
	sigprocmask(SIG_SETMASK, &tmp, NULL);
 
	return 0;
 
}
Ou celui ci :
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
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
 
int main(int argc, char *argv[])
{
 
	printf("pid : %d\n", getpid());
 
	sigset_t sig_proc_mask, tmp;
	sigfillset(&sig_proc_mask);
	sigdelset(&sig_proc_mask, SIGTERM);
	sigdelset(&sig_proc_mask, SIGIO);
	sigdelset(&sig_proc_mask, SIGINT);
	sigdelset(&sig_proc_mask, SIGSTOP);
	sigdelset(&sig_proc_mask, SIGKILL);
	//sigprocmask(SIG_SETMASK, &sig_proc_mask, &tmp);
 
	sigset_t sig_empty_mask;
	sigemptyset(&sig_empty_mask);
 
	printf("avant\n");
	sigsuspend(&sig_proc_mask);
	printf("après\n");
 
	//sigprocmask(SIG_SETMASK, &tmp, NULL);
 
	return 0;
 
}
Dans les deux cas, sigsuspend() s'arrête avec un signal SIGIO ou SIGTERM par exemple, mais, et cela me semble anormal, il s'arrete aussi avec des signaux comme SIGUSR1 ou bien SIGURG (je n'en ai pas testé beaucoup, mais tous ceux que j'ai testé, même quand leur action par défaut est discard signal, ils passeront le sigsuspend() ). D'autre part, tous les signaux entrainent une fin normale du programme (ils ne killent pas le programme brutalement).

J'ai regardé le man et ils indiquent qu'il faut bloquer les signaux que l'on ne veut pas laisser passer (soit par sigsuspend(), soit par sigprocmask()) et que sigsuspend() attend ensuite qu'un signal lui arrive. Mais comment un signal peut-il lui arriver s'il est bloqué ?

Bref, peut être ai-je mal interprété le man, mais j'aimerais des explications ou des éclaircissements sur ce comportement, est-il normal ou non ?

Merci