[so] [Tema 1] pipe

Ciprian Mihai Coman ciprianmihai.coman at gmail.com
Sat Mar 13 19:04:48 EET 2010


2010/3/12 Lucian Cojocar <cojocar at gmail.com>

> Ciprian Mihai Coman wrote:
>
>> Salut,
>>
>> Imi poate explica cineva cum se creaza un pipe intre doua procese pentru
>> STDOUT -> STDIN. Eu am facut ceva de genul (exemplu pentru ls | grep h):
>>
>> pipe(fd);
>> fork
>>    close(fd[1])
>>    dup2(fd[0], stdin)
>>    executa grep
>>    close(fd[0])
>>    exit
>> close(fd[0])
>> dup2(fd[1],stdout)
>> executa ls
>> close(fd[1])
>> waitpid(proces fork)
>>
>> Problema este ca nu se termina grep. Aparent stdout din parinte ramane
>> redirectat catre copil si dupa ce inchid ambele capete ale pipe-ului din
>> parinte (cout << "here" rezulta in printarea "here" in copil).
>>
>>  Funcția exec* nu iese niciodată în caz de succes. Ea înlocuiește imaginea
> procesului curent. Așa că ce e dupa ea nu se execută niciodată. Practic
> rămâi fară părinte. Ai putea să faci două forkuri, și, în parinte, să
> aștepți ambele procese.
>
> Adică rămâi cu grep deschis, ceea ce e normal.
>

Inteleg ca nu se poate lucra cu redirectare pipe->STDIN pentru ca programul
din exec nu stie cand se termina inputul din pipe. O solutie ar fi sa
bufferez eu tot ce trimite programul 1 prin pipe si apoi sa rulez programul
2 cu bufferul ca argument. Nu exista o solutie mai eleganta?

-- 
Ciprian Coman
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20100313/9eac8e0e/attachment.htm>


More information about the so mailing list