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

Andrei Ivanes andrei.ivanes at gmail.com
Thu Aug 16 11:28:53 EEST 2007


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


More information about the so mailing list