[so] Tema 1 Windows problema ciudata

Maximilian Machedon maximilian.machedon at gmail.com
Sun Nov 5 08:28:10 EET 2006


        Pe Linux/Unix se poate specifica in mod clar care sunt parametrii 
noului proces, deoarece exec primeste un vector de parametri (fiecare 
element fiind un parametru). Pe Windows se da un singur string ce contine 
toti parametrii si separarea lor se face de catre libraria standard C/C++. 
Cel mai probabil, implementarea de pe Windows considera ca parametrii sunt 
separati cu spatii si ca, daca vrei sa ai un parametru ce contine spatii, il 
incadrezi astfel: "parametru". Daca completezi la CreateProcess parametrii 
astfel, o sa iti mearga echo. Cu alte cuvinte, apelul corect al lui echo pe 
Windows are parametrul lpCommandLine  ==  <"echo" "bla { bla"> (fara 
parantezele unghiulare)

        Implementarea parsarii liniei de comanda o poti gasi in fisierul:
"C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\stdargv.c" pentru 
Visual Studio 2005 Professional

        Cea de pe cygwin probabil este similara, deci probabil are acelasi 
comportament.



----- Original Message ----- 
From: Dragan Stefan
To: 'Sisteme de Operare'
Sent: Saturday, November 04, 2006 11:55 PM
Subject: RE: [so] Tema 1 Windows problema ciudata


Nope. Nici un ascii sau Unicode. Faza e ca parserul e cretin. Adica: daca 
dau "echo 'bla bla' etc etc" el va descompune param in "bla bla", "etc", 
"etc". faza e ca daca tu vrei sa apelezi CreateProcess si bagi la command 
line textul  recompus pe baza arborelui obti ceva de genul "echo bla bla etc 
etc". se pierd apostroafele alea care fac ca unele charactere din linia de 
parametrii sa apara cand dai echo.
De fapt e o chestie specifica linux: tb sa pui un param intre ghilimele daca 
nu vrei sa pierzi din simboluri atunci cand apelezi ceva.
Pe win daca dai: "echo bla { bla" se va afisa "bla { bla"
Pe linux daca dai: "echo bla { bla" se va afisa "bla  bla" si doar daca dai 
"echo 'bla { bla'" se va afisa "bla { bla".
Ce pot sa zic . ori e o chestie f inteligenta din partea linuxului ori una f 
prosta. Bla bla :P

From: so-bounces at cursuri.cs.pub.ro [mailto:so-bounces at cursuri.cs.pub.ro] On 
Behalf Of Catalin Iacob
Sent: Saturday, November 04, 2006 10:25 PM
To: so at cursuri.cs.pub.ro
Subject: [so] Tema 1 Windows problema ciudata

Salut

Raspunsul de aseara a fost foarte util, multumesc din nou.

Mai am nevoie de ajutor pentru o problema destul de bizara:  am vazut ca 
tema pica testele 4 si 5 din cauza acoladei deschise de la echo ' int main 
{ ....'
Mai precis { nu apare in output. Si programul nu compileaza si deci testul 
pica cu glorie.

Am facut tot felul de incercari de comenzi simple in shellul din tema mea:

echo 'a{b' imi scrie doar a
echo 'aaa { bbb' imi scrie aaa  bbb (cu 2 spatii deci practic elimina 
acolada)
echo '{' nu scrie nimic
echo '{}' scrie culmea {} ... e singurul mod in care am reusit sa fac sa 
apara o acolada deschisa
echo 'aa{}bb' scrie aabb fara nici o acolada si fara spatiu
echo 'aa{ }bb' (cu spatiu intre acolade) scrie aa }bb

Evident ca totusi in marea majoritate a cazurilor shellul merge ca altfel 
problema nu era bizara, adica echo 'ana are mere'  afiseaza ana are mere. 
Problema e cu acolada deschisa.

Singurul lucru la care pot sa ma gandesc e ca problema vine de la dualitatea 
Unicode / Ascii de pe Windows sau de la faptul ca din cine stie ce motive 
CreateProcessA trateaza special caracterul { din pathul pe care il primeste. 
Fiindca portez tema de pe Linux am ales sa folosesc ASCII si deci apelez 
CreateProcessA careia ii trimit un char[] pe post de parametru 2 
lpCommandLine (care e LPCSTR adica tot aia). Daca afisez inainte parametrul 
pe care urmeaza sa-l trimit lui CreateProcessA , pentru echo 'aa{bb' el este 
echo aa{bb (presupun ca de eliminarea ' se ocupa parserul) deci ok si totusi 
rezultatul comenzii e ca imi scrie doar aa.

Ce as putea sa fac?

Multumesc



More information about the so mailing list