Matt Wilson a écrit :

> > read() doesn't return on signal. Why ? I want it to return with
> > errno=EINTR. How can I do that ?
>
> read should return on a signal - do you have a test case that shows
> differently?

Look this little test prog:

#include <signal.h>
void fsig(int sig)
{
        printf("Sig received\n");
}

main()
{
        char c;

signal(SIGALRM,fsig);
alarm(2);

read(0,&c,1);
printf("Done\n");
}

ltrace output:

__libc_start_main(0x0804847c, 1, 0xbffffb24, 0x08048304, 0x080484ec
<unfinished ...>
__register_frame_info(0x08049530, 0x08049610, 0xbffffae4, 0x08048329,
0x4010a1ec) = 0x4010ad40
signal(14, 0x08048468)                            = NULL
alarm(2)                                          = 0
read(0,  <unfinished ...>
--- SIGALRM (Minuterie d'alerte) ---
printf("Sig received\n"Sig received
)                          = 13
breakpointed at 0x400c0ad1 (?)

strace output:

execve("./a.out", ["./a.out"], [/* 25 vars */]) = 0
brk(0)                                  = 0x8049628
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x40014000
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or
directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=18211, ...}) = 0
old_mmap(NULL, 18211, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40015000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=4101324, ...}) = 0
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\210\212"...,
4096) = 4096
old_mmap(NULL, 1001564, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x4001a000
mprotect(0x40107000, 30812, PROT_NONE)  = 0
old_mmap(0x40107000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED,
3, 0xec000) = 0x40107000
old_mmap(0x4010b000, 14428, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4010b000
close(3)                                = 0
mprotect(0x4001a000, 970752, PROT_READ|PROT_WRITE) = 0
mprotect(0x4001a000, 970752, PROT_READ|PROT_EXEC) = 0
munmap(0x40015000, 18211)               = 0
personality(PER_LINUX)                  = 0
getpid()                                = 1910
rt_sigaction(SIGALRM, {0x8048468, [], SA_RESTART|0x4000000}, {SIG_DFL},
8) = 0
alarm(2)                                = 0
read(0, 0xbffffad7, 1)                  = ? ERESTARTSYS (To be
restarted)
--- SIGALRM (Minuterie d'alerte) ---
fstat64(0x1, 0xbffff228)                = -1 ENOSYS (Function not
implemented)
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x40015000
ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0
write(1, "Sig received\n", 13Sig received
)          = 13
sigreturn()                             = ? (mask now [])
read(0,

Christophe



_______________________________________________
Redhat-devel-list mailing list
[EMAIL PROTECTED]
https://listman.redhat.com/mailman/listinfo/redhat-devel-list

Reply via email to