Salut, Teodor!

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.
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.
Dacă nu știi cum se rezolva exercițiul, găsești rezolvările publice aici[2].

[1]
https://ocw.cs.pub.ro/courses/so/laboratoare/laborator-03#c_implementarea_unei_comenzi_cu_pipe-uri_15p
[2] http://elf.cs.pub.ro/so/res/laboratoare/lab03-sol.zip

Numai bine,
Răzvan

On Tue, Apr 4, 2017 at 1:58 AM Cotet Teodor Mihai via so <
so@cursuri.cs.pub.ro> wrote:

> 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:
>
> Din cauza diferenței între Windows și Linux la crearea de noi procese (
> CreateProcess vs. fork + exec), 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 CreateProcess de pe Windows.
>
> 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).
>
> 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)?
>
> Teo
>
> 2017-04-03 23:17 GMT+03:00 Cotet Teodor Mihai <teodor.co...@gmail.com>:
>
> Salut,
>
> Pe windows avem voie sa apelam CreateProcess pe executabilul nostru
> (minishell)?
>
> 2017-04-03 11:24 GMT+03:00 Costin Lupu via so <so@cursuri.cs.pub.ro>:
>
> On Mon, 2017-04-03 at 10:48 +0300, Theodor Stoican wrote:
> > Pe 3 aprilie 2017, 10:01, Costin Lupu <costin....@gmail.com> a scris:
> >         On Mon, 2017-04-03 at 09:42 +0300, Theodor Stoican via so
> >         wrote:
> >         > Salut,
> >         >
> >         >
> >         >
> >         > > Aici e o problemă. Subcomenzile a, b și c *trebuie* să
> >         ruleze în
> >         > > paralel. De altfel ne putem gândi la operatorul '|' ca la
> >         un operator de
> >         > > paralelizare, cu diferența că subcomenzile comunică între
> >         ele
> >         >
> >         >
> >         > Se vrea acest comportament doar pentru comenzile externe? Nu
> >         vad cum
> >         > ai putea respecta acest comportament pentru cd, fara sa
> >         deschizi
> >         > thread-uri.
> >
> >         Fix ca în cazul operatorului de paralelizare, și pentru
> >         operatorul pipe
> >         procesele pornesc în paralel și se pot termina în orice
> >         ordine. Nu ai
> >         nevoie de thread-uri. Nu înțeleg de unde vine nelămurirea ta,
> >         mai am
> >         nevoie de niște clarificări în sensul ăsta.
> >
> >         Ia spre exemplu comanda: 'cd | echo foo'. Subcomanda 'echo
> >         foo' nici
> >         măcar nu citește de la stdin.
> >
> > Nu inteleg cum poti lansa cele 2 procese in paralel fara sa pornesti
> > threaduri.
>
> Păi și thread-urile alea nu tot secvențial le pornești?
>
> > Singura varianta pe care o vad e sa transformi functia intr-un
> > executabil si sa i-l dai ca parametru lui CreateProcess. Altfel
> > parcurgerea arborelui e inerent secventiala. Imi scapa ceva?
>
> Cred că tu te gândești să pornești procesele fix în același timp. Ori
> asta ar fi posibil doar pe sistemele multiprocesor și doar dacă
> kernel-ul ți-ar furniza un astfel de syscall (de care eu n-am auzit).
> Ori mini-shell-ul (ca și bash-ul) pornește comenzi în paralel indiferent
> de numărul de procesoare de pe sistem.
>
> Costin
>
>
>
> _______________________________________________
> http://ocw.cs.pub.ro/courses/so/info/lista-discutii
>
>
>
> _______________________________________________
> http://ocw.cs.pub.ro/courses/so/info/lista-discutii
_______________________________________________
http://ocw.cs.pub.ro/courses/so/info/lista-discutii

Raspunde prin e-mail lui