<div dir="ltr">Salut, Teodor!<div><br></div><div>Nu aveți voie să apelați nici exec() nici CreateProcess() pe executabilul vostru. Și nici nu aveți nevoie de asta, există alte metode mult mai simple.</div><div>Ai rezolvat exercițiul 2c de pe Windows din cadrul laboratorului 3[1]. Acolo (la fel ca și în temă) trebuia să implementați operatorul pipe ("|"). Pentru a-l folosi, aveți nevoie de două procese care rulează _în paralel_: unul scrie în capătul de scriere al pipe-ului, celălalt citește din capătul de citire. Dacă l-ai rezolvat la laborator, sunt convins că lnici nu ai apelat executabilul tău, nici nu ai creat thread-uri noi. Ci ai folosit alt pincipiu pentru a rula cele două comenzi în paralel. Fix același principiu trebuie folosit și acum.</div><div>Dacă nu știi cum se rezolva exercițiul, găsești rezolvările publice aici[2].</div><div><br></div><div>[1] <a href="https://ocw.cs.pub.ro/courses/so/laboratoare/laborator-03#c_implementarea_unei_comenzi_cu_pipe-uri_15p">https://ocw.cs.pub.ro/courses/so/laboratoare/laborator-03#c_implementarea_unei_comenzi_cu_pipe-uri_15p</a></div><div>[2] <a href="http://elf.cs.pub.ro/so/res/laboratoare/lab03-sol.zip">http://elf.cs.pub.ro/so/res/laboratoare/lab03-sol.zip</a></div><div><br></div><div>Numai bine,</div><div>Răzvan</div><div><br><div class="gmail_quote"><div dir="ltr">On Tue, Apr 4, 2017 at 1:58 AM Cotet Teodor Mihai via so <<a href="mailto:so@cursuri.cs.pub.ro">so@cursuri.cs.pub.ro</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">Adica nu vad altfel cum as putea ajunge sa execut in paralel comenzi (fara threaduri), decat apeland CreateProcess pe propia-mi tema si sunt derutat pentru ca in tema se specifica ca nu pot apela execv pe propia-mi tema si (ok scrie execv nu CreateProcess), dar mai scrie si asta:<br class="gmail_msg"><br class="gmail_msg">Din cauza diferenței între Windows și Linux la crearea de noi procese (<code class="gmail_msg">CreateProcess</code> vs. <code class="gmail_msg">fork</code> + <code class="gmail_msg">exec</code>),
s-ar putea să nu puteți folosi același tip de parcurgere a arborelui
sintactic și pe Windows și pe Linux. Dacă vreți să reutilizați
concepte/cod de pe Linux pe Windows, concepeți parcurgerea să
funcționeze și cu funcția <code class="gmail_msg">CreateProcess</code> de pe Windows.<br class="gmail_msg"><br class="gmail_msg"></div>Din asta ar reiesi ca exista o metoda de implentare pe linux care creeaza procese in maniera CreateProcess (fork + exec), dar eu daca fac CreateProccess(minishell) pe windows, ar implica ca fac execv(minishell) pe Linux, cea ce e interzis. Asadar din enuntul temei ar reiesi ca nu prea am voie sa fac CreateProcess(minishell).<br class="gmail_msg"><br class="gmail_msg"></div>In fine, am scris asta ca sa intelegi mai bine nedumerirea mea, intrebarea finala e cam aceeasi, pot face CreatePorcess pe propria-mi tema, sau exista alta metoda (fara threaduri) de a executa comenzi in paralel (dau createprocess pe altceva)?<br class="gmail_msg"><br class="gmail_msg"></div>Teo<br class="gmail_msg"></div><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg">2017-04-03 23:17 GMT+03:00 Cotet Teodor Mihai <span dir="ltr" class="gmail_msg"><<a href="mailto:teodor.cotet@gmail.com" class="gmail_msg" target="_blank">teodor.cotet@gmail.com</a>></span>:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg">Salut,<br class="gmail_msg"><br class="gmail_msg"></div>Pe windows avem voie sa apelam CreateProcess pe executabilul nostru (minishell)? <br class="gmail_msg"><div class="gmail_msg"><div class="m_1015382063833782544h5 gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg">2017-04-03 11:24 GMT+03:00 Costin Lupu via so <span dir="ltr" class="gmail_msg"><<a href="mailto:so@cursuri.cs.pub.ro" class="gmail_msg" target="_blank">so@cursuri.cs.pub.ro</a>></span>:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_1015382063833782544m_3753330543021315725m_9205437572457262904HOEnZb gmail_msg"><div class="m_1015382063833782544m_3753330543021315725m_9205437572457262904h5 gmail_msg">On Mon, 2017-04-03 at 10:48 +0300, Theodor Stoican wrote:<br class="gmail_msg">
> Pe 3 aprilie 2017, 10:01, Costin Lupu <<a href="mailto:costin.lup@gmail.com" class="gmail_msg" target="_blank">costin.lup@gmail.com</a>> a scris:<br class="gmail_msg">
> On Mon, 2017-04-03 at 09:42 +0300, Theodor Stoican via so<br class="gmail_msg">
> wrote:<br class="gmail_msg">
> > Salut,<br class="gmail_msg">
> ><br class="gmail_msg">
> ><br class="gmail_msg">
> ><br class="gmail_msg">
> > > Aici e o problemă. Subcomenzile a, b și c *trebuie* să<br class="gmail_msg">
> ruleze în<br class="gmail_msg">
> > > paralel. De altfel ne putem gândi la operatorul '|' ca la<br class="gmail_msg">
> un operator de<br class="gmail_msg">
> > > paralelizare, cu diferența că subcomenzile comunică între<br class="gmail_msg">
> ele<br class="gmail_msg">
> ><br class="gmail_msg">
> ><br class="gmail_msg">
> > Se vrea acest comportament doar pentru comenzile externe? Nu<br class="gmail_msg">
> vad cum<br class="gmail_msg">
> > ai putea respecta acest comportament pentru cd, fara sa<br class="gmail_msg">
> deschizi<br class="gmail_msg">
> > thread-uri.<br class="gmail_msg">
><br class="gmail_msg">
> Fix ca în cazul operatorului de paralelizare, și pentru<br class="gmail_msg">
> operatorul pipe<br class="gmail_msg">
> procesele pornesc în paralel și se pot termina în orice<br class="gmail_msg">
> ordine. Nu ai<br class="gmail_msg">
> nevoie de thread-uri. Nu înțeleg de unde vine nelămurirea ta,<br class="gmail_msg">
> mai am<br class="gmail_msg">
> nevoie de niște clarificări în sensul ăsta.<br class="gmail_msg">
><br class="gmail_msg">
> Ia spre exemplu comanda: 'cd | echo foo'. Subcomanda 'echo<br class="gmail_msg">
> foo' nici<br class="gmail_msg">
> măcar nu citește de la stdin.<br class="gmail_msg">
><br class="gmail_msg">
> Nu inteleg cum poti lansa cele 2 procese in paralel fara sa pornesti<br class="gmail_msg">
> threaduri.<br class="gmail_msg">
<br class="gmail_msg">
</div></div>Păi și thread-urile alea nu tot secvențial le pornești?<br class="gmail_msg">
<span class="gmail_msg"><br class="gmail_msg">
> Singura varianta pe care o vad e sa transformi functia intr-un<br class="gmail_msg">
> executabil si sa i-l dai ca parametru lui CreateProcess. Altfel<br class="gmail_msg">
> parcurgerea arborelui e inerent secventiala. Imi scapa ceva?<br class="gmail_msg">
<br class="gmail_msg">
</span>Cred că tu te gândești să pornești procesele fix în același timp. Ori<br class="gmail_msg">
asta ar fi posibil doar pe sistemele multiprocesor și doar dacă<br class="gmail_msg">
kernel-ul ți-ar furniza un astfel de syscall (de care eu n-am auzit).<br class="gmail_msg">
Ori mini-shell-ul (ca și bash-ul) pornește comenzi în paralel indiferent<br class="gmail_msg">
de numărul de procesoare de pe sistem.<br class="gmail_msg">
<br class="gmail_msg">
Costin<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
<a href="http://ocw.cs.pub.ro/courses/so/info/lista-discutii" rel="noreferrer" class="gmail_msg" target="_blank">http://ocw.cs.pub.ro/courses/so/info/lista-discutii</a></blockquote></div><br class="gmail_msg"></div></div></div></div></div></div>
</blockquote></div><br class="gmail_msg"></div>
_______________________________________________<br class="gmail_msg">
<a href="http://ocw.cs.pub.ro/courses/so/info/lista-discutii" rel="noreferrer" class="gmail_msg" target="_blank">http://ocw.cs.pub.ro/courses/so/info/lista-discutii</a></blockquote></div></div></div>