<br><br><div class="gmail_quote">2010/3/12 Lucian Cojocar <span dir="ltr">&lt;<a href="mailto:cojocar@gmail.com">cojocar@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div></div><div class="h5">Ciprian Mihai Coman wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Salut,<br>
<br>
Imi poate explica cineva cum se creaza un pipe intre doua procese pentru<br>
STDOUT -&gt; STDIN. Eu am facut ceva de genul (exemplu pentru ls | grep h):<br>
<br>
pipe(fd);<br>
fork<br>
    close(fd[1])<br>
    dup2(fd[0], stdin)<br>
    executa grep<br>
    close(fd[0])<br>
    exit<br>
close(fd[0])<br>
dup2(fd[1],stdout)<br>
executa ls<br>
close(fd[1])<br>
waitpid(proces fork)<br>
<br>
Problema este ca nu se termina grep. Aparent stdout din parinte ramane<br>
redirectat catre copil si dupa ce inchid ambele capete ale pipe-ului din<br>
parinte (cout &lt;&lt; &quot;here&quot; rezulta in printarea &quot;here&quot; in copil).<br>
<br>
</blockquote></div></div>
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.<br>

<br>
Adică rămâi cu grep deschis, ceea ce e normal.<br>
</blockquote></div><br>Inteleg ca nu se poate lucra cu redirectare pipe-&gt;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?<br clear="all">
<br>-- <br>Ciprian Coman<br>