Hello,
je souhaite qu'un programme suspendu par un appel system bloquant (read(2)) reprenne le contrôle lors de la réception d'un signal. La doc de read(2) indique bien un code de retour EINTR et renvoie vers signal(7) qui mentionne le drapeau SA_RESTART nécessaire lors du positionnement du "handler" du signal pour que ça fonctionne... mais benh si je suis là à poser la question... c'est que ça ne marche pas... je dois faire qqch de travers? Mais quoi?
ci-dessous un petit bout de code pour illustrer ce que j'aimerai voir :
Or, une fois le programme lancé, par exemple taper CTRL-C (signal SIGINT) ne fait pas sortir de l'appel system read() :
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
45
46
47
48
49
50
51
52
53
54
55 ~ > cat eintr.c #include <stdio.h> #include <signal.h> #include <unistd.h> #include <errno.h> #include <assert.h> #include <string.h> #define BUFSIZE 100 void handler(int s); void reader(int fd); int main() { struct sigaction sigact; sigact.sa_handler = &handler; sigact.sa_flags = SA_RESTART; sigaction(SIGTERM, &sigact, NULL); sigaction(SIGINT, &sigact, NULL); reader(0); } void handler(int s) { fprintf(stderr, "received signal %d\n", s); } void reader(int fd) { char buffer[BUFSIZE+1]; int ret = -1; while(ret <= 0) { ret = read(fd, buffer, BUFSIZE); if(ret < 0) if(errno == EINTR) fprintf(stderr, "Signal received in read() call, looping\n"); else fprintf(stderr, "read() failed with error: %s\n", strerror(errno)); else if(ret == 0) fprintf(stderr, "Reached End of File\n"); else /* ret > 0 , but ret should be less than or equal to BUFSIZE */ { assert(ret <= BUFSIZE); buffer[ret+1] = '\0'; fprintf(stderr, "read() provided %n bytes: %s", ret, (char*)(buffer)); } } }
des idées de ce qui cloche dans ce que je fais ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 ~ >./eintr coucou read() provided 7 bytes: coucou ~ >./eintr ^Creceived signal 2 ^Creceived signal 2 ^Creceived signal 2 ^Creceived signal 2 ^Creceived signal 2 ^Creceived signal 2
merci pour toute aide![]()
Partager