<div class="gmail_quote">2011/5/25 Drutu Bogdan <span dir="ltr"><<a href="mailto:bogdandrutu@gmail.com">bogdandrutu@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
2011/5/25 Cosmin Stefan-Dobrin <<a href="mailto:cosminstefanxp@gmail.com">cosminstefanxp@gmail.com</a>>:<br>
<div><div></div><div class="h5">> Revin si cu un "screen" al ce se intampla, pentru a reliefa mai bine (in<br>
> paranteza dupa debug e threadID si la handle-uri sunt handle-urile (primul<br>
> hRead, al doilea hWrite):<br>
><br>
>> echo "test" | cat | nl<br>
> [DEBUG][3484] Command successfully read: echo "test" | cat | nl<br>
><br>
> [DEBUG][3484] Parallel command detected<br>
> [DEBUG][3484] Piped Command detected.<br>
> [DEBUG][3484] Created pipe with handle (2016,1996)<br>
> [DEBUG][3484] Created threads 3488 - 3492<br>
> [DEBUG][3488] Thread started with command tree: 00322B20<br>
> [DEBUG][3488] Parallel command detected<br>
> [DEBUG][3488] Piped Command detected.<br>
> [DEBUG][3488] Created pipe with handle (1984,1976)<br>
> [DEBUG][3488] Created threads 3496 - 3500<br>
> [DEBUG][3492] Thread started with command tree: 00322B90<br>
> [DEBUG][3492] Simple command detected...<br>
> [DEBUG][3492] Verb:<br>
> nl<br>
> [DEBUG][3492] Full parameters list: nl<br>
> [DEBUG][3492] Preparing redirections...<br>
> [DEBUG][3492] ---------------------------------------------------------<br>
> [DEBUG][3492] Closing IN handle 2016<br>
> [DEBUG][3496] Thread started with command tree: 00322A88<br>
> [DEBUG][3496] Simple command detected...<br>
> [DEBUG][3496] Verb:<br>
> echo<br>
> [DEBUG][3496] Full parameters list: echo "test"<br>
> [DEBUG][3496] Preparing redirections...<br>
> [DEBUG][3496] ---------------------------------------------------------<br>
> [DEBUG][3496] Closing OUT handle 1976<br>
> [DEBUG][3500] Thread started with command tree: 00322B00<br>
> [DEBUG][3500] Simple command detected...<br>
> [DEBUG][3500] Verb:<br>
> cat<br>
> [DEBUG][3500] Full parameters list: cat<br>
> [DEBUG][3500] Preparing redirections...<br>
> [DEBUG][3500] ---------------------------------------------------------<br>
> 1 test<br>
> [DEBUG][3500] Closing IN handle 1984<br>
> [DEBUG][3500] Closing OUT handle 1996<br>
> [DEBUG][3496] ---------------------------------------------------------<br>
> [DEBUG][3496] Process returned 0<br>
> [DEBUG][3488] Thread 0 finished with return value 0.<br>
><br>
><br>
> --<br>
> Cosmin<br>
><br>
><br>
> 2011/5/25 Cosmin Stefan-Dobrin <<a href="mailto:cosminstefanxp@gmail.com">cosminstefanxp@gmail.com</a>><br>
>><br>
>> Salutare,<br>
>><br>
>> Am si eu o mica problema cu pipe-urile pe Windows si nu reusesc sa-mi dau<br>
>> seama ce are. Ei bine, ideea e ca pana acum totul ne merge bine, mai putin<br>
>> cazul in care avem mai mult de 2 pipe-uri inlantuite. Daca avem: 'echo ana |<br>
>> nl' totul e ok. In schimb daca avem 'echo ana | cat | nl', operatia o face<br>
>> cu succes, dar nu se termina. Procesul lui echo se inchide, in schimb<br>
>> celelalte 2 nu. Deci probabil ele inca mai asteapta ceva pe Pipe-uri, desi<br>
>> eu zic ca le-am inchis cum trebuie (Altfel nu se termina nici pentru 2<br>
>> pipe-uri).<br>
>><br>
>> Ideea e ca noi am folosit threaduri. Cand dam peste o comanda paralela,<br>
>> sunt create doua threaduri, fiecare ocupandu-se de o jumate de arbore. In<br>
>> fiecare moment fiecare thread (inclusiv cel principal) stie ce handle-uri<br>
>> are pentru in/out/err. Initial acestea sunt stdin/out/err, dar atunci cand<br>
>> creez un pipe, ii comunic thrreadului ca , de exemplu, out-ul lui e<br>
>> handle-ul cutare. Threadul, dupa ce va crea procesul ce executa comanda,<br>
>> daca stie ca un cap e pipe, il inchide.<br>
>><br>
>> Din codul de debug pe care il am se vede ca pe procesul parinte (cu<br>
>> threaduri cu tot) se inchid toate cele 4 capete ale celor 2 pipe-uri create<br>
>> (in cazul exemplului de mai sus), dar tot nu se inchid procesele spawn-uite.<br>
>><br>
>> Conteaza ordinea in care sunt inchise pipe-urile (atat timp cat sunt<br>
>> inchise de thread dupe ce creaza procesul comenzii si inainte sa il<br>
>> astepte)?<br>
>> Exista vreun flag necesar pentru a trimite pe pipe EOF cand se inchide<br>
>> Handle-ul?<br>
<br>
</div></div>Trebuie sa inchizi capetele pipe-urilor si in procesul parinte, pentru<br>
ca ele raman deschise si asta poate fi un motiv pentru care celelalte<br>
procese cred ca mai au de unde sa primeasca date si nu se termina.<br>
(Adica nu primesc eventul de pipe closed si raman blocate in read).<br>
<br></blockquote><div>Pai daca inchid in thread, nu e ok? Nu am mai multe procese... threadurile si procesul parinte partajeaza handlerele by default, nu?<br><br>Cosmin <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
>><br>
>> Thanks a lot,<br>
>> Cosmin<br>
>><br>
><br>
><br>
> _______________________________________________<br>
> <a href="http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii" target="_blank">http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii</a><br>
><br>
<font color="#888888"><br>
<br>
<br>
--<br>
Bogdan.<br>
_______________________________________________<br>
<a href="http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii" target="_blank">http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii</a><br>
</font></blockquote></div><br>