[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
System calls interrupted by signals - or not
From: |
Danny Milosavljevic |
Subject: |
System calls interrupted by signals - or not |
Date: |
Thu, 1 Feb 2018 01:01:53 +0100 |
Hi Mark,
>This can happen if interrupted by a signal,
If only BSD-style signals (SA_RESTART) are used, as is very likely, this
should not happen.
It only happens with old "PC-losering" style signal handlers - which even
signal(2) doesn't install anymore (and I know of no reason why anyone
should ever use those).
If an OK design limitation is to support only SA_RESTART handlers, I think it
suffices to forbid anyone from using msgrcv and msgsnd. That's all. No EINTR
loops or buffer position adjustments necessary.
Otherwise I made a table some years ago when this bit me, I'll paste it here:
Affected Linux syscalls in glibc 2.19 (each lists the newest version only):
E futex
E semop
E semtimedop
E pause
f ptrace (FIXME)
E rt_sigsuspend
E T rt_sigtimedwait
E sigsuspend
E waitid
E waitpid
E creat
E open
E openat
E B read
E B write
close (DO NOT retry on EINTR)
E U pselect6
E dup
E dup2
E dup3
E T epoll_pwait
E T epoll_wait
E fallocate
E fcntl64
E flock
E ftruncate64
E truncate64
E T poll
E T ppoll
E T io_getevents (timeout not modified) (libaio) (only for the direct
syscall! otherwise F)
E fstatfs64
E statfs64
E accept4
E connect
E B recv
E B recvfrom
E B recvmsg
E B send
E B sendmsg
E B sendto
E request_key
e t clock_nanosleep
E t nanosleep
E B t mq_timedreceive
E B t mq_timedsend
E B msgrcv [IGNORES SA_RESTART]
E B msgsnd [IGNORES SA_RESTART]
E B preadv
E B readv
E B pwritev
E B writev
E U newselect
E B getrandom
Meaning:
E ... returns (-1), sets errno == EINTR
e ... returns EINTR directly.
f ... returns (-1) whenever it feels like it, but sets errno on errors.
F ... returns less than min_nr on error.
B ... have to adjust buffer
T ... have to adjust timeout. Note that timeout is optional usually.
t ... have to adjust timeout, but that's easy. Note that timeout is
optional usually.
U ... have to adjust timeout, but "timeout is undefined". Note that
timeout is optional usually.
Note: read() returns EFAULT on SEGV instead of doing SIGSEGV.
>or if the file system was full.
Yeah, I think I had this too some time ago.