Re: [so] [Tema2][Linux] Numarul de fork-uri necesare pentru implementarea pipe-ului
2016-03-29 16:23 GMT+03:00 Costin Lupu via so: > Salutare, Teodor, > > On Tue, 2016-03-29 at 16:02 +0300, Teodor Ciuraru via so wrote: >> Salut! >> >> Legat de implementarea pipe-ului, am observat că pe Internet (pe Stack, cel >> puțin) sunt două tabere, tabară celor care prezintă implementarea pipe-ului >> cu un singur fork() și cea a celor care implementează cu două fork-uri, >> întrepătrunse. > > Nu înțeleg ce vrei să zici nici prin "un singur fork()", nici prin > "fork-uri întrepătrunse". Care sunt link-urile unde ai găsit aceste > informații? > Hai sa abordam altfel: cate procese creaza urmatoarea comanda de bash: cat cucu | grep mimi | grep cici ? Dupa ce afli raspunsul gandeste-te ca fork returneaza 0 si atunci esti pe caz de proces copil, daca e alta valoare pozitiva esti pe procesul parinte. -- Cu stimă, Mihai Bărbulescu ___ http://ocw.cs.pub.ro/courses/so/info/lista-discutii
Re: [so] [Tema2][Linux] Numarul de fork-uri necesare pentru implementarea pipe-ului
Da, e o confuzie aici. Analizăm situația simplă: 'cmd1 | cmd2'. Vezi răspunsurile mele inline. On Tue, 2016-03-29 at 16:36 +0300, Teodor Ciuraru wrote: > Într-adevăr, este puțin mai greu de înțeles ce vreau să zic fără sursă > în sine. :P > > > În link-ul acesta, folosește două fork-uri (dar aici face clar > referire referire la pipe-uri multiple). > http://stackoverflow.com/questions/3642732/using-dup2-for-piping > > Două fork-uri în răspunsul cel mai de jos: > http://stackoverflow.com/questions/8082932/connecting-n-commands-with-pipes-in-a-shell > > La fel: > http://stackoverflow.com/questions/2589906/unix-piping-using-fork-and-dup > http://stackoverflow.com/questions/13417278/piping-in-a-basic-shell-implementation Situația cu 2 fork-uri: - fork+exec pt cmd1 - fork+exec pt cmd2 - mini-shell-ul rulează în continuare, deci mai poate primi comenzi > Primul răspuns din link-ul acesta prezintă un singur fork: > http://stackoverflow.com/questions/21914632/implementing-pipe-in-c > > Un singur fork: > http://stackoverflow.com/questions/8082932/connecting-n-commands-with-pipes-in-a-shell Situația cu 1 fork: - fork+exec pt cmd1 - exec pt cmd2 - mini-shell-ul nu mai există, imaginea lui a fost înlocuită cu imaginea pt cmd2, deși e același proces (pid); comanda compusă 'cmd1 | cmd2' se va executa cu succes, însă mini-shell-ul nu mai poate primi comenzi Clar abordarea asta nu te ajută cu nimic la temă. M-a pus pe gânduri totuși când ai zis că îți merge și cu 1 singur fork. Noroc că ai codul pe gitlab și am văzut despre ce era vorba. La implementarea ta curentă, pe care presupun că o cataloghezi ca având 2 fork-uri, de fapt ai 4: do_on_pipe(cmd1, cmd2): - fork pt cmd1; parse_simple(cmd1) - fork pt cmd2; parse_simple(cmd2) parse_simple(cmd): - fork pt cmd Total: 4 fork-uri Asta îmi spune că implementarea ta cu "un singur fork", de fapt are 3 fork-uri. De-aia îți trece testele. Dacă aveai cu adevărat un singur fork, după primul pipe ți s-ar fi terminat sesiunea de mini-shell. Concluzie: dacă vrei să mai ai mini-shell-ul running după ce rulezi 'cmd1 | cmd2', nu poți folosi doar 1 fork. > Este clar că fac o confuzie referitor la problemă și sper să o > rezolvăm. > > > Nu înțeleg ce vrei să zici nici prin "un singur fork()", nici prin > > "fork-uri întrepătrunse". Care sunt link-urile unde ai găsit aceste > > informații? > > > > > Am încercat ambele variante și testele 9 și 10 trec în ambele > > > cazuri. > > > > > > Aș dori să știu de ce îmi trec testele, atât având un singur > > > fork() la nivelul funcției do_on_pipe(), cât în cazul celor două > > > fork-uri. > > > > > > Singura diferență pe care am sesizat-o la implementarea cu un > > > singur fork() este că, cu toate că testele trec, rulând o comandă > > > cu operatorul pipe îmi închide mini-shell-ul deschis (ceea ce ar > > > putea fi cauzat de altceva, dar în cazul altor comenzi nu se > > > întâmplă). > > > > > > Care este varianta corectă de implementare? Costin ___ http://ocw.cs.pub.ro/courses/so/info/lista-discutii
Re: [so] [Tema2][Linux] Numarul de fork-uri necesare pentru implementarea pipe-ului
Salutare, Teodor, On Tue, 2016-03-29 at 16:02 +0300, Teodor Ciuraru via so wrote: > Salut! > > Legat de implementarea pipe-ului, am observat că pe Internet (pe Stack, cel > puțin) sunt două tabere, tabară celor care prezintă implementarea pipe-ului > cu un singur fork() și cea a celor care implementează cu două fork-uri, > întrepătrunse. Nu înțeleg ce vrei să zici nici prin "un singur fork()", nici prin "fork-uri întrepătrunse". Care sunt link-urile unde ai găsit aceste informații? > Am încercat ambele variante și testele 9 și 10 trec în ambele cazuri. > > Aș dori să știu de ce îmi trec testele, atât având un singur fork() la > nivelul funcției do_on_pipe(), cât în cazul celor două fork-uri. > > Singura diferență pe care am sesizat-o la implementarea cu un singur fork() > este că, cu toate că testele trec, rulând o comandă cu operatorul pipe îmi > închide mini-shell-ul deschis (ceea ce ar putea fi cauzat de altceva, dar în > cazul altor comenzi nu se întâmplă). > > Care este varianta corectă de implementare? Costin ___ http://ocw.cs.pub.ro/courses/so/info/lista-discutii
[so] [Tema2][Linux] Numarul de fork-uri necesare pentru implementarea pipe-ului
Salut! Legat de implementarea pipe-ului, am observat că pe Internet (pe Stack, cel puțin) sunt două tabere, tabară celor care prezintă implementarea pipe-ului cu un singur fork() și cea a celor care implementează cu două fork-uri, întrepătrunse. Am încercat ambele variante și testele 9 și 10 trec în ambele cazuri. Aș dori să știu de ce îmi trec testele, atât având un singur fork() la nivelul funcției do_on_pipe(), cât în cazul celor două fork-uri. Singura diferență pe care am sesizat-o la implementarea cu un singur fork() este că, cu toate că testele trec, rulând o comandă cu operatorul pipe îmi închide mini-shell-ul deschis (ceea ce ar putea fi cauzat de altceva, dar în cazul altor comenzi nu se întâmplă). Care este varianta corectă de implementare? ___ http://ocw.cs.pub.ro/courses/so/info/lista-discutii