Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

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




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: