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