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