<div dir="ltr"><div>Mersi pentru raspunsul detaliat.<br>Cu toate astea sa inteleg ca aceasta 
abordare stil laborator (unde aveam doar comenzi simple care aveau 
nevoie de un singur executabil) merge si la operatorul de paralelizare? 
(fara threaduri, doar cu createprocess)<br><br></div>Teo<div class="gmail-yj6qo gmail-ajU"><div tabindex="0" class="gmail-ajR" id="gmail-:15b"><img src="https://ssl.gstatic.com/ui/v1/icons/mail/images/cleardot.gif" class="gmail-ajT"></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-04-04 10:10 GMT+03:00 Razvan Crainea <span dir="ltr"><<a href="mailto:razvan.crainea@gmail.com" target="_blank">razvan.crainea@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><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" target="_blank">https://ocw.cs.pub.ro/<wbr>courses/so/laboratoare/<wbr>laborator-03#c_implementarea_<wbr>unei_comenzi_cu_pipe-uri_15p</a></div><div>[2] <a href="http://elf.cs.pub.ro/so/res/laboratoare/lab03-sol.zip" target="_blank">http://elf.cs.pub.ro/so/<wbr>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><div class="h5"><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" target="_blank">so@cursuri.cs.pub.ro</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr" class="m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749gmail_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="m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_msg">Din cauza diferenței între Windows și Linux la crearea de noi procese (<code class="m_-7105881655778103749gmail_msg">CreateProcess</code> vs. <code class="m_-7105881655778103749gmail_msg">fork</code> + <code class="m_-7105881655778103749gmail_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="m_-7105881655778103749gmail_msg">CreateProcess</code> de pe Windows.<br class="m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_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="m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_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="m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_msg"></div>Teo<br class="m_-7105881655778103749gmail_msg"></div><div class="gmail_extra m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_msg"><div class="gmail_quote m_-7105881655778103749gmail_msg">2017-04-03 23:17 GMT+03:00 Cotet Teodor Mihai <span dir="ltr" class="m_-7105881655778103749gmail_msg"><<a href="mailto:teodor.cotet@gmail.com" class="m_-7105881655778103749gmail_msg" target="_blank">teodor.cotet@gmail.com</a>></span>:<br class="m_-7105881655778103749gmail_msg"><blockquote class="gmail_quote m_-7105881655778103749gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749gmail_msg">Salut,<br class="m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_msg"></div>Pe windows avem voie sa apelam CreateProcess pe executabilul nostru (minishell)? <br class="m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749m_1015382063833782544h5 m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749gmail_msg"><div class="gmail_extra m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_msg"><div class="gmail_quote m_-7105881655778103749gmail_msg">2017-04-03 11:24 GMT+03:00 Costin Lupu via so <span dir="ltr" class="m_-7105881655778103749gmail_msg"><<a href="mailto:so@cursuri.cs.pub.ro" class="m_-7105881655778103749gmail_msg" target="_blank">so@cursuri.cs.pub.ro</a>></span>:<br class="m_-7105881655778103749gmail_msg"><blockquote class="gmail_quote m_-7105881655778103749gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-7105881655778103749m_1015382063833782544m_3753330543021315725m_9205437572457262904HOEnZb m_-7105881655778103749gmail_msg"><div class="m_-7105881655778103749m_1015382063833782544m_3753330543021315725m_9205437572457262904h5 m_-7105881655778103749gmail_msg">On Mon, 2017-04-03 at 10:48 +0300, Theodor Stoican wrote:<br class="m_-7105881655778103749gmail_msg">
> Pe 3 aprilie 2017, 10:01, Costin Lupu <<a href="mailto:costin.lup@gmail.com" class="m_-7105881655778103749gmail_msg" target="_blank">costin.lup@gmail.com</a>> a scris:<br class="m_-7105881655778103749gmail_msg">
>         On Mon, 2017-04-03 at 09:42 +0300, Theodor Stoican via so<br class="m_-7105881655778103749gmail_msg">
>         wrote:<br class="m_-7105881655778103749gmail_msg">
>         > Salut,<br class="m_-7105881655778103749gmail_msg">
>         ><br class="m_-7105881655778103749gmail_msg">
>         ><br class="m_-7105881655778103749gmail_msg">
>         ><br class="m_-7105881655778103749gmail_msg">
>         > > Aici e o problemă. Subcomenzile a, b și c *trebuie* să<br class="m_-7105881655778103749gmail_msg">
>         ruleze în<br class="m_-7105881655778103749gmail_msg">
>         > > paralel. De altfel ne putem gândi la operatorul '|' ca la<br class="m_-7105881655778103749gmail_msg">
>         un operator de<br class="m_-7105881655778103749gmail_msg">
>         > > paralelizare, cu diferența că subcomenzile comunică între<br class="m_-7105881655778103749gmail_msg">
>         ele<br class="m_-7105881655778103749gmail_msg">
>         ><br class="m_-7105881655778103749gmail_msg">
>         ><br class="m_-7105881655778103749gmail_msg">
>         > Se vrea acest comportament doar pentru comenzile externe? Nu<br class="m_-7105881655778103749gmail_msg">
>         vad cum<br class="m_-7105881655778103749gmail_msg">
>         > ai putea respecta acest comportament pentru cd, fara sa<br class="m_-7105881655778103749gmail_msg">
>         deschizi<br class="m_-7105881655778103749gmail_msg">
>         > thread-uri.<br class="m_-7105881655778103749gmail_msg">
><br class="m_-7105881655778103749gmail_msg">
>         Fix ca în cazul operatorului de paralelizare, și pentru<br class="m_-7105881655778103749gmail_msg">
>         operatorul pipe<br class="m_-7105881655778103749gmail_msg">
>         procesele pornesc în paralel și se pot termina în orice<br class="m_-7105881655778103749gmail_msg">
>         ordine. Nu ai<br class="m_-7105881655778103749gmail_msg">
>         nevoie de thread-uri. Nu înțeleg de unde vine nelămurirea ta,<br class="m_-7105881655778103749gmail_msg">
>         mai am<br class="m_-7105881655778103749gmail_msg">
>         nevoie de niște clarificări în sensul ăsta.<br class="m_-7105881655778103749gmail_msg">
><br class="m_-7105881655778103749gmail_msg">
>         Ia spre exemplu comanda: 'cd | echo foo'. Subcomanda 'echo<br class="m_-7105881655778103749gmail_msg">
>         foo' nici<br class="m_-7105881655778103749gmail_msg">
>         măcar nu citește de la stdin.<br class="m_-7105881655778103749gmail_msg">
><br class="m_-7105881655778103749gmail_msg">
> Nu inteleg cum poti lansa cele 2 procese in paralel fara sa pornesti<br class="m_-7105881655778103749gmail_msg">
> threaduri.<br class="m_-7105881655778103749gmail_msg">
<br class="m_-7105881655778103749gmail_msg">
</div></div>Păi și thread-urile alea nu tot secvențial le pornești?<br class="m_-7105881655778103749gmail_msg">
<span class="m_-7105881655778103749gmail_msg"><br class="m_-7105881655778103749gmail_msg">
> Singura varianta pe care o vad e sa transformi functia intr-un<br class="m_-7105881655778103749gmail_msg">
> executabil si sa i-l dai ca parametru lui CreateProcess. Altfel<br class="m_-7105881655778103749gmail_msg">
> parcurgerea arborelui e inerent secventiala. Imi scapa ceva?<br class="m_-7105881655778103749gmail_msg">
<br class="m_-7105881655778103749gmail_msg">
</span>Cred că tu te gândești să pornești procesele fix în același timp. Ori<br class="m_-7105881655778103749gmail_msg">
asta ar fi posibil doar pe sistemele multiprocesor și doar dacă<br class="m_-7105881655778103749gmail_msg">
kernel-ul ți-ar furniza un astfel de syscall (de care eu n-am auzit).<br class="m_-7105881655778103749gmail_msg">
Ori mini-shell-ul (ca și bash-ul) pornește comenzi în paralel indiferent<br class="m_-7105881655778103749gmail_msg">
de numărul de procesoare de pe sistem.<br class="m_-7105881655778103749gmail_msg">
<br class="m_-7105881655778103749gmail_msg">
Costin<br class="m_-7105881655778103749gmail_msg">
<br class="m_-7105881655778103749gmail_msg">
<br class="m_-7105881655778103749gmail_msg">
<br class="m_-7105881655778103749gmail_msg">
______________________________<wbr>_________________<br class="m_-7105881655778103749gmail_msg">
<a href="http://ocw.cs.pub.ro/courses/so/info/lista-discutii" rel="noreferrer" class="m_-7105881655778103749gmail_msg" target="_blank">http://ocw.cs.pub.ro/courses/<wbr>so/info/lista-discutii</a></blockquote></div><br class="m_-7105881655778103749gmail_msg"></div></div></div></div></div></div>
</blockquote></div><br class="m_-7105881655778103749gmail_msg"></div></div></div>
______________________________<wbr>_________________<br class="m_-7105881655778103749gmail_msg">
<a href="http://ocw.cs.pub.ro/courses/so/info/lista-discutii" rel="noreferrer" class="m_-7105881655778103749gmail_msg" target="_blank">http://ocw.cs.pub.ro/courses/<wbr>so/info/lista-discutii</a></blockquote></div></div></div>
</blockquote></div><br></div>