[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