I have noticed some unexpected behaviour on both OS X and Linux. Turning on non-blocking I/O (using O_NONBLOCK
) for standard output turns it on for standard inp
When a process is started from the shell, stdin
, stdout
and stderr
point to the same file description. This file description is marked as O_NONBLOCK
by your fcntl(1)
call and therefore expectedly both file descriptors are marked as O_NONBLOCK
.
If you want to indeed write to the same file from two file descriptors but want one to be marked as O_NONBLOCK
, you need to create a new file description for the same file. If you know the file name of the file in question, you can achieve this by simply calling open()
with the desired file name and flags. On some operating systems, you can find the file name using a platform-specific API, such as the /proc/fd
virtual file system (many Unices including Linux) or the fd2path()
function from Plan 9. Refer to this question for more details.
Note that simply calling open("/dev/fd/0", ...)
may not work as intended as it returns a pointer to the same file description on some platforms if I recall correctly.