-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path4_1-sig.c
71 lines (56 loc) · 1.45 KB
/
4_1-sig.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
67
68
69
70
71
/*
* Auteur(s):
*/
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
//#define SIGILL 4
//#define SIGQUIT 4
//#define SIGINT 2
void (*sig_avant)(int); /* pour la question 4.3 */
void message1(int n) {
printf("message numéro 1\n");
}
void message2(int n) {
printf("message numéro 2\n");
}
void swMessage(int n) {
sig_avant = signal(SIGINT, sig_avant);
}
void hdl_sys1(int n) {
printf("hdl_sys1: Signal recu: %d\n", n);
}
void travail() {
/* Je travaille tres intensement ! */
/* Ne cherchez pas a comprendre ;-) */
/* Il n'y a rien a modifier ici */
const char msg[] = "-\\|/";
const int sz = strlen(msg);
int i = 0;
for (;;) {
write(STDOUT_FILENO, "\r", 1);
usleep(100000);
write(STDOUT_FILENO, " => ", 4);
write(STDOUT_FILENO, &msg[i++], 1);
if (i == sz) i = 0;
}
}
void travail() __attribute__((noreturn));
/* Petit raffinement pour le compilateur: cette fonction ne termine pas */
int main() {
printf("PID: %d\n", getpid());
signal(SIGILL, hdl_sys1);
signal(SIGQUIT, swMessage);
//signal(SIGINT,message1);
sig_avant = message2;
struct sigaction sa;
sa.sa_handler = message1;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART; /* Restart functions if interrupted by handler */
if (sigaction(SIGINT, &sa, NULL) == -1) {
printf("Some error occur");
}
travail();
}