[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