Hacker Newsnew | comments | show | ask | jobs | submit login
Two things every Unix developer should know (factor-language.blogspot.com)
88 points by mahmud 1724 days ago | 11 comments



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

-----


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

-----


If you need that, you should be using the low-level read() / write() instead.

-----


I came here to ask, does anyone know what Unix means in this context?

-----


Apparently "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.

-----


I should say, Unix in this context means any Unix-like system that Factor runs on (Linux, FreeBSD, OpenBSD, Mac OS X)

-----


There are several claims made in the article, and I'm skeptical that all of those things are completely true for all of those.

-----


Each one is true for at least one of those platforms.

-----


POSIX.1 , according to my signal(7).

-----


Maybe 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

-----


glibc: TEMP_FAILURE_RETRY()

http://www.delorie.com/gnu/docs/glibc/libc_498.html

-----




Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | DMCA | Apply to YC | Contact

Search: