I have a script that writes to a named pipe and another that reads from the pipe. Occasionally, when starting the script I have noticed that the contents of the pipe exist from a previous run of the script. Is there a way to flush out the pipe at the beginning of the script?
Asked
Active
Viewed 1.5k times
3 Answers
15
I think dd
is your friend:
dd if=myfifo iflag=nonblock of=/dev/null
strace shows
open("myfifo", O_RDONLY|O_NONBLOCK)
and indeed doesn't even block on an empty fifo.

mvds
- 45,755
- 8
- 102
- 111
-
confused, this is not bash is it? – Alexander Mills Jul 08 '17 at 03:46
-
2Not in the sense of using bash-builtin commands/features, but definitely in the sense of a shell scripting solution using standard unix tools. – mvds Jul 08 '17 at 04:47
1
You can read from the pipe until it is empty. This will effectively flush it.
Before you attempt this daring feat, call fcntl(mypipe, F_SETFL, O_NONBLOCK)
(I don't know the shell-scripting equivalent) to make a read when the pipe is empty not hang your program.

Borealid
- 95,191
- 9
- 106
- 122
1
Try this:
"Opening the FD read/write rather than read-only when setting up the pipeline prevents blocking."
from:
Setting up pipelines reading from named pipes without blocking in bash