If I have a program which creates and attempts to open a named pipe using mkfifo, how can I open a pipe for reading or writing without blocking?
Specifically, I'm writing a C program which can be run with or without a gui (written in Java).
In the C program, I successfully create the named pipes using mkfifo, however when I do
FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/
fopen doesn't return until the GUI opens that pipe for writing. What I wish to do is have that pipe ready to be read once (if) the GUI decides to write to it – I'll be putting the file descriptor in a select() call. It's reasonable to expect that the java GUI may never actually be started, so I cannot rely on it to open the other end of the pipe at any specific point or even at all.
I will also have a second pipe open for writing, and I assume I will have the same problem. Further, I can't set O_NONBLOCK on an output pipe that has no reader.
Any suggestions?
(This is running on a linux system)
Best Answer
You could
open()
your pipeO_RDONLY | O_NONBLOCK
, and if you want the C stream, you can get it withfdopen()
. However, there might be a problem with theselect()
- AFAIK, a pipe fd open for reading that has no writer is always prepared for reading, andread()
returns 0, so theselect()
would fire indefinitely.A kludgy way of overcoming this would be to open the pipe
O_RDWR
; that is, have at least one writer (your C++ program). Which would solve your problem anyway.