Re: [so] [Tema2][Linux] Numarul de fork-uri necesare pentru implementarea pipe-ului

2016-03-29 Fir de Conversatie Mihai Barbulescu via so
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

2016-03-29 Fir de Conversatie Costin Lupu via so
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

2016-03-29 Fir de Conversatie 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?

> 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

2016-03-29 Fir de Conversatie Teodor Ciuraru via so
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