I have a couple of C programs sending messages back and forth through FIFO named pipes in Unix, and I want to see what's going through the pipes using an external program. The problem is that if I use
cat, it stops after the next time my program calls
write() and closes the pipe, breaking the communication between the programs... and then bad things happen. I don't understand why
cat is closing my pipe. EDIT: Actually, I did the exact same thing today, and instead of closing the pipe, it just made the process stop reading from it.
So is there something like
cat except that it won't interfere with the pipes at all, just print whatever it sees going through?
In case it's relevant, I create the pipes like this in C:
outs[i2/2] = open("/tmp/pipe_w", O_WRONLY); ins[i2/2] = open("/tmp/pipe_r", O_RDONLY);
Update: Here's a terminal example.
My processes print this output as they open the pipes:
Opened in pipe at /tmp/ai1In Opened out pipe at /tmp/ai1Out
Then I do this in a separate shell:
admin$ cat /tmp/ai1Out ai1
It sees the message "ai1" go through and then nothing. The process reading that pipe ends up waiting forever. I kill
cat, but the pipe still ends up not being read from.
cat [path] | tee [path] works in some cases. It doesn't interfere noticeably with my
ai1Out pipe, but it interferes with
ai1In. The difference must be due to my code. Regardless, this means that running this command has some effect on the other processes using the pipes, which I don't want. When I try to read
ai1Out, I just see this, then the process writing to that pipe gets an error on its next
admin$ cat /tmp/ai1In | tee /tmp/ai1In ]2,15,43,66,65,61,53,20,30,27,40,16,50,41,48[[[[[[[[