[so] [Tema1]Problema parser & nelamurire pipe-uri

Maximilian Machedon maximilian.machedon at gmail.com
Thu Aug 16 11:37:58 EEST 2007


   Diferenta intre bash si cmd este din cauza ca ele parseaza diferit linia
de comanda data de tine. Cred ca cmd da "orbeste" string-ul la CreateProcess
(dupa expandari), pe cand bash se comporta diferit. Nu bag mana in foc de
unde e diferenta, depinde si de metoda cu care ai obtinut lista rezultata de
parametri.
    In principiu nu ar trebui sa te intereseze aceasta diferenta deoarece
implementezi un shell nou cu un parser nou. Parserul imita in mare
comportamentul bash, dar nu este identic cu el si nici nu se cere sa fie.
Trebuie doar sa ai grija ca parametrii dati de parser sa ajunga bine la
procesul creat. In parserul temei "" se folosesc pentru a permite expandarea
de variabile si '' pentru a nu mai expanda variabile.


On 8/16/07, Andrei Ivanes <andrei.ivanes at gmail.com> wrote:
>
> On 8/16/07, Octavian Purdila <tavi at cs.pub.ro> wrote:
> > On Wednesday 15 August 2007 10:05, Andrei Ivanes wrote:
> >
> >
> > Hint:
> > 1. [WIN]
> > - pentru echo 'int main() { return 0;}' parserul o sa iti intoarca un
> arbore
> > in care comanda e echo dar ai un singur parametru.
> > - pentru echo int main() { return 0; } (fara ghililmele) parserul o sa
> iti
> > intoarca un arbore in care comanda e echo si ai 6 parametri.
> >
> Om observat asta, dar problema este: cum imi dau seama daca are
> ghilimele sau apostrofi (dispar amandoua). As putea sa ma uit sa vad
> daca fiecare parametru are spatii si sa ii pun ghilimele sau apostrofi
> parametrului, dar care?
> In bash (cygwin) am vazut ca nu conteaza daca sunt apostrofi sau
> ghilimele dar pentru cmd.exe conteaza
>
> In win de exemplu daca ii dau unui program parametrii (in shellul
> standard):
>
> "%USERPROFILE% blah" '%USRPROFILE% blah' "blah blah" 'blah blah'
>
> parametrii or sa fie (in imaginea VMware de pe site)
>
> 1: C:\Documents and Settings\so blah
> 2: 'C:\Documents
> 3: and
> 4: Settings\so
> 5: blah'
> 6: blah blah
> 7: 'blah
> 8: blah'
>
> dar in shelul bash (cygwin) pentru parametrii:
>
> "$USERPROFILE blah" '$USERPROFILE blah' "blah blah" 'blah blah'
>
> parametrii sunt:
>
> 1: C:\Docuements and Settings\so blah
> 2: $USERPROFILE blah
> 3: blah blah
> 4: blah blah
>
> Cam irelevant avant in vedere ca corectarea se face in bash (cygwin),
> dar totusi...
>
> Pana la urma as putea sa ma uit in parametru inainte de expandare
> (daca este cazul) si sa vad daca are spatii, iar daca are sa ii pun
> ghilimele. Dar apare o problema: daca parametrul este:
>
> "$USERPROFILE"
>
> cum as putea sa imi dau seama ca trebuie sa ii pun ghilimele?
>
> > > 2. [WIN]
> > >
> >
> > Ce iti trebuie de fapt, este setarea handler-ului ca fiind inheritable.
> > Problema cu close-ul este cu totul alta. Pentru setarea handler-ului ca
> > inheritatble:
> >
> > 1. Nu trebuie sa faci neaparat un DuplicateHandle, poti folosi
> > SetHandleInformation.
> >
> > 2. Poti folosi DuplicateHandle cu acelasi proces sursa/destinatie.
> >
> > [iar pentru problema cu close: create pipe, setezi pipe-ul ca
> inheritable,
> > create process, close pipe din procesul parinte - dupa create process]
> >
> In cele din urma m-am gandit sa fac asa, dar cred ca apare un race
> condition, desi foarte putin probabil: daca procesul din capatul de
> scriere al pipe-ului termina inainte ca shell-ul meu sa dea close la
> pipe, ReadFile-ul din procesul care capatul de citire din pipe o sa
> tot astepte date chiar si dupa ce dau close la pipe in shell (asta a
> fost problema mea initiala, dar atunci inchideam pipe-ul in procesul
> parinte dupa terminarea proceselor child).
>
> > tavi
> >
>
> --
> --
> Multumesc,
> Andrei Ivanes 342 C1
> _______________________________________________
> so mailing list
> so at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://cursuri.cs.pub.ro/pipermail/so/attachments/20070816/20231188/attachment.htm


More information about the so mailing list