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.