For Programmers: Free Programming Magazines  


Home > Archive > Unix Programming > October 2004 > EOF on pipe









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author EOF on pipe
Derek Tattersall

2004-10-18, 8:56 pm


This problem occurs on both Free BSD and Linux.

I have a parent-child situation, where the parent creates two pipes,
and then forks(), then the child exec's a sort. The parent then reads
the pipe to get the sorted output. SO...

parent:
establishes 2 pipes pfd1 and pfd2 which have both read and
write ends. Parent writes records to The write end of the
pipe connected to STDIN of the child.

child:
dup2() the pipe ends, the read end of pfd1 to STDIN and the write end
of pfd2 to STDOUT. The child then execlp() /usr/bin/sort -n.

Sort reads the input, does it's thing, then writes the output. The
parent reads the pfd2 read end, and manipulates the sorted output.

The problem is, I never see the EOF on the sorted output.

I found that the read loop in the parent could terminate on a
waitpid() or by using a signal handler for SIGCHLD, and a variable
shared between the signal handler and the parent code, I could
terminate the read loop. But I never saw the read() terminate with a
count of 0 indicating EOF.

Since this situation behaved uniformly over Linux, FreeBSD current,
and dragonfly-BSD, I suspect I am running into a subtlety that is
architected.

Anybody got any clues for me?

--
Derek Tattersall | Nothing cures insomnia like the realization that
| it's time to get up.
dlt@mebtel.net |
|
dlt666@yahoo.com |
Jonathan Adams

2004-10-18, 8:56 pm

In article <868ya3hjnn.fsf@lapdog.arm.org>,
Derek Tattersall <dlt@mebtel.net> wrote:

> This problem occurs on both Free BSD and Linux.
>
> I have a parent-child situation, where the parent creates two pipes,
> and then forks(), then the child exec's a sort. The parent then reads
> the pipe to get the sorted output. SO...
>
> parent:
> establishes 2 pipes pfd1 and pfd2 which have both read and
> write ends. Parent writes records to The write end of the
> pipe connected to STDIN of the child.
>
> child:
> dup2() the pipe ends, the read end of pfd1 to STDIN and the write end
> of pfd2 to STDOUT. The child then execlp() /usr/bin/sort -n.


> Sort reads the input, does it's thing, then writes the output. The
> parent reads the pfd2 read end, and manipulates the sorted output.
>
> The problem is, I never see the EOF on the sorted output.
>


You need to make sure the parent and child close the ends of each
pipe they are not using. The read end of the pipe will not return EOF
until all of the write ends have been closed.

Cheers,
- jonathan

P.S. You should note that this is generally a dangerous construct (since
you can easily deadlock, due to the limited kernel input buffers), but
since sort(1) usually has to read all of its input before having any
output, it's not a problem in this case.
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com