How to send EOF to the popen(3) pipe?

Montgomery-Smith, Stephen stephen at missouri.edu
Sat Jan 16 18:08:58 UTC 2016


On 01/16/2016 11:59 AM, Yuri wrote:
> On 01/15/2016 20:35, Montgomery-Smith, Stephen wrote:
>> Maybe I am displaying my ignorance.  But wouldn't you do this by
>> invoking the function pclose?
> 
> No, pclose kills the process and returns the exit code. Half-closed
> connection though can be alive for a while, until the other side
> finishes and closes the pipe.
> 
>> My memory of using this was that this could gridlock because of
>> buffering.  Suppose process A popens a process B.  A sends a message to
> 
> Gridlocks are possible if reads/writes are performed in the wrong order.
> But this is besides the point of the original question.
> 
> I think the answer to my question is "no". popen(3) can't send EOF.
> Protocol needs to support EOF signal on the application-level.

Yes.  I think a "proper" implementation would be via a function like
popen2 https://emergent.unpythonic.net/01108826729, which creates 2 file
handles, not just one.  Then to send the EOF, you would close one of the
file handles (the "to_child"), and then only close the other file handle
(the "from_child") when it receives an EOF.

For the popen2 code to be compatible with stdio, you should run fdopen
on each file descriptor to create FILE*s.


More information about the freebsd-hackers mailing list