guix-devel
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]