[cs631apue] Question about pipe

Chao Cui ccui1 at stevens.edu
Sun Dec 16 14:51:03 EST 2012


>For example, I have two pipe in the child process, one is fd1[2] and one
>is fd2[2], if I use fd1[0] and fd2[1], then I must close fd1[1] and
>fd2[0]. In the parent process, I use fd1[1] and fd2[0] and I must
>close its pairs.

I think that is the right way of using pipe. Because pipe only support one
way communication.
When you create a pipe then fork a child. Both the parent and the child
holds fd1[2]. Then you can close the corresponding file descriptor to
determine the direction of the data flow.
If you want to send data from parent to child using fd1[2].
You should close fd1[0] in your parent process and close fd1[1] in your
child process.
In your parent process: close(fd1[0]), write(fd1[1],data,len);
In your child process: close(fd1[1]), read(fd1[0],data,len);

Is that what you are asking for?

Thanks

2012/12/16 hyan2 <hyan2 at stevens.edu>

> Thanks for your answer. But the read end of the pipe, say fd1[0], is
> connected to STDIN_FILENO(use dup2()), why I need close fd1[0] after
> dup2(). All of close function is before data communication process not
> after communication. That's why I am confused. By the way, I used two pipes
> connect to child's STDIN_FILENO and STDOUT_FILENO so that parent can
> directly write data(receive from socket) to child's STDIN_FILENO and read
> data from child's STDOUT_FILENO and send it to client. I think one pipe is
> not enough in my program.
>
>
> On Sun, 16 Dec 2012 10:36:40 -0500, Chao Cui wrote:
>
>> I think the pipe file descriptor with index 1 fd[1] is used for write
>> and fd[0] is used for read. If you don't close fd[0] in the read side,
>> it will block. That's why your browser will waiting for response.
>> Further more, I don't think you need tow pipes. One is enough. You can
>> just create one pipe in the parent process. Then you can use it to do
>> communication between parent and child.
>> See the example in the Book.
>>
>> Thanks
>> Chao
>>
>> 2012/12/16 hyan2
>>
>>  Hi Professor,
>>>
>>> I use pipe for the communication between child process and parent
>>> process when I implement POST response. I use two pairs pipe but I
>>> find that I must close the other pipe to get the right result. For
>>> example, I have two pipe in the child process, one is fd1[2] and one
>>> is fd2[2], if I use fd1[0] and fd2[1], then I must close fd1[1] and
>>> fd2[0]. In the parent process, I use fd1[1] and fd2[0] and I must
>>> close its pairs. If I don't close those pairs I find my browser is
>>> waiting for result and when I terminate the server's process, the
>>> browser will get the right result. If I close those pairs, every
>>> thing is ok. I am confused about this. Could you explain this
>>> problem?
>>>
>>> Thank you.
>>>
>>> -Han
>>> ______________________________**_________________
>>> cs631apue mailing list
>>> cs631apue at lists.stevens.edu [1]
>>> https://lists.stevens.edu/cgi-**bin/mailman/listinfo/cs631apue<https://lists.stevens.edu/cgi-bin/mailman/listinfo/cs631apue>[2]
>>>
>>
>>
>>
>> Links:
>> ------
>> [1] mailto:cs631apue at lists.**stevens.edu <cs631apue at lists.stevens.edu>
>> [2] https://lists.stevens.edu/cgi-**bin/mailman/listinfo/cs631apue<https://lists.stevens.edu/cgi-bin/mailman/listinfo/cs631apue>
>> [3] mailto:hyan2 at stevens.edu
>>
> ______________________________**_________________
> cs631apue mailing list
> cs631apue at lists.stevens.edu
> https://lists.stevens.edu/cgi-**bin/mailman/listinfo/cs631apue<https://lists.stevens.edu/cgi-bin/mailman/listinfo/cs631apue>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.stevens.edu/pipermail/cs631apue/attachments/20121216/b44377ac/attachment.html>


More information about the cs631apue mailing list