interruption d'appel système par un signal
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:
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:
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 :mrgreen: