EOF on pipe
Web Server forum
Back To The Forum Home!Search!Private Messaging System

Web Server Talk Web Server Talk > Unix and Linux reviews > Free Unix support > Unix Programming > EOF on pipe




  Last Thread   Next Thread Next
  Show Printable Version Email this Page Subscribe to this Thread      Post New Thread    Post A Reply      

    EOF on pipe  
Derek Tattersall


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
10-19-04 01:48 AM


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   |





[ Post a follow-up to this message ]



    Re: EOF on pipe  
Jonathan Adams


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
10-19-04 01:48 AM

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.





[ Post a follow-up to this message ]



    Sponsored Links  




 





   All times are GMT. The time now is 12:48 PM.      Post New Thread    Post A Reply      
  Last Thread   Next Thread Next


Most Popular forums 

Forum Jump:
Rate This Thread:

Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is OFF
 
Medical and Health forum | Computer Games Reviews | Graphics design forum

Back To The Top
Home | Usercp | Faq | Register