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

Raspunde prin e-mail lui