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 :

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));
            }
    }
}
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
 
~ >./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
des idées de ce qui cloche dans ce que je fais ???
merci pour toute aide