-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathexemple_signaux.c
66 lines (59 loc) · 1.7 KB
/
exemple_signaux.c
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
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
static void * thread_compteur(void * inutile);
static void * thread_signaux(void * inutile);
static int compteur = 0;
static pthread_mutex_t mutex_compteur = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond_compteur = PTHREAD_COND_INITIALIZER;
static pthread_t thr_signaux;
static pthread_t thr_compteur;
int
main(void) {
pthread_create(& thr_compteur, NULL, thread_compteur, NULL);
pthread_create(& thr_signaux, NULL, thread_signaux, NULL);
pthread_exit(NULL);
}
static void *
thread_compteur(void * inutile) {
sigset_t masque;
sigfillset(& masque);
pthread_sigmask(SIG_BLOCK, & masque, NULL);
while (1) {
pthread_mutex_lock(& mutex_compteur);
pthread_cleanup_push(pthread_mutex_unlock,
(void *) & mutex_compteur);
pthread_cond_wait(& cond_compteur,
& mutex_compteur);
fprintf(stdout, "Compteur : %d \n", compteur);
if (compteur > 5)
break;
pthread_cleanup_pop(1); /* mutex_unlock */
}
pthread_cancel(thr_signaux);
return (NULL);
}
static void *
thread_signaux(void * inutile) {
sigset_t masque;
int numero;
sigemptyset(& masque);
sigaddset(& masque, SIGINT);
sigaddset(& masque, SIGQUIT);
while (1) {
sigwait(& masque, & numero);
pthread_mutex_lock(& mutex_compteur);
switch (numero) {
case SIGINT:
compteur++;
break;
case SIGQUIT:
compteur--;
break;
}
pthread_cond_signal(& cond_compteur);
pthread_mutex_unlock(& mutex_compteur);
}
return (NULL);
}