4 ms·
Two things every Unix developer should know
- cperciva 16y agoThe EINTR error can be raised at any time for any reason, so essentially every I/O operation on a Unix system must be prepared to handle this error properly. Surprisingly to some, this includes the C standard library functions such as fread(), fwrite(), and so on. I think the editors of C99 and POSIX would be surprised by this too. Any non-buggy fread or fwrite should retry on EINTR.
- tbrownaw 16y agoAny non-buggy fread or fwrite should retry on EINTR. But maybe not unconditionally retry. Say you got SIGTERM while waiting on network I/O and need to go flush something to disk and exit (instead of just resuming your wait or calling arbitrary code from your signal handler), or you got SIGCHLD on a subprocess and need to clean up stuff related to that.
- caf 16y agoIf you need that, you should be using the low-level read() / write() instead.
- sprout 16y agoI came here to ask, does anyone know what Unix means in this context?
- patrickgzill 16y agoApparently "Unix" means "Linux" as the way this can be implemented varies from Unix to Unix. Actually the introduction of this in the kernel back in '97 or so caused the company I was working for a lot of grief, and a quick recompile, since after a kernel upgrade the binaries we supplied were no longer working reliably.
- tbrownaw 16y agoPOSIX.1 , according to my signal(7).
- slava_pestov 16y agoI should say, Unix in this context means any Unix-like system that Factor runs on (Linux, FreeBSD, OpenBSD, Mac OS X)
- sprout 16y agoThere are several claims made in the article, and I'm skeptical that all of those things are completely true for all of those.
- slava_pestov 16y agoEach one is true for at least one of those platforms.
- audidude 16y agoglibc: TEMP_FAILURE_RETRY() http://www.delorie.com/gnu/docs/glibc/libc_498.html http://www.delorie.com/gnu/docs/glibc/libc_498.html
- hvs 16y agoMaybe unrelated, but this made me think of "The Rise of 'Worse is Better'": (NOTE: In this context, "PC" means "Program Counter".) "... The PC loser-ing problem occurs when a user program invokes a system routine to perform a lengthy operation that might have significant state, such as IO buffers. If an interrupt occurs during the operation, the state of the user program must be saved. Because the invocation of the system routine is usually a single instruction, the PC of the user program does not adequately capture the state of the process. The system routine must either back out or press forward. The right thing is to back out and restore the user program PC to the instruction that invoked the system routine so that resumption of the user program after the interrupt, for example, re-enters the system routine. ..." http://www.jwz.org/doc/worse-is-better.html http://www.jwz.org/doc/worse-is-better.html