[so] [Tema1][Windows]Sistem de fisiere

Flamaropol Daniel raptorclw at gmail.com
Tue Mar 10 16:26:01 EET 2009


Salut si mersi pentru raspuns!

Am dat exemplul cu pwd tocmai pentru ca este cel mai simplu. Pentru a 
ajunge la modul cum folosesc GetCurrentDirectory() voi arata mai multi 
pasi din executia si testarea temei :


1. Masina virtuala accesata prin ssh, direct in cygwin.

2. Pornit Tema1.exe
**.1.Tema acceseaza directorul curent pentru a sti cu ce parametrii sa 
porneasca procesele copii ( il iau cu GetCurrentDirectory() si il 
stochez local. Aceasta este primul si ultimul apel al acestei functii)

3.O simpla comanda cd _ceva_
**.1. Tema incearca sa faca urmatoarele 2 operatii, in speranta ca una 
dintre ele va fi intoarce true :
**.2. SetCurrentDirectory(currentPath + _ceva_)
**.3. SetCurrentDirectory(_ceva_)
**.4. Daca vreuna dintre ele intoarce true, inseamna ca directorul 
respectiv exista si voi face schimbarea.

4.O simpla comanda echo "ceva" > /tmp/fisier.txt
**.1 Tema incearca sa creeze fisierul folosind CreateFile()
**.2 CreateFile() intoarce CANNOT_FIND_FILE

5.Comanda whoami
**.1 Tema intoarce "Administrator"
**.2 comanda scrisa in afara temei (prin ssh) intoarce 
"scarlet/administrator"

6.Comanda whoami --help
**.1 Tema intoarce "Incorrect syntax, try whoami /? instead"
**.2 comanda scrisa in afara temei ( prin ssh ) intoarce help-ul lui whoami


Concluzii :
1. Pentru Windows, sistemul de fisiere virtual cygwin nu exista.
2. Daca exista o functie ( echo, whoami, etc ) care exista deja in 
Windows, aceea va fi apelata prima, si nu echivalentul ei din cygwin. 
Aceasta poate induce probleme cu numarul de parametrii, formatul lor si 
poate chiar modul de executie al comenzii.


Comentarii :
La punctul 2, am avut surpriza sa observ ca executabilul compilat pe 
masina mea locala ( in mod suprinzator, tot Windows Server 2003 R2 ) nu 
executa pe masina virtuala ( "Permission Denied", desi am incercat sa ii 
modific drepturile, etc ). In schimb cel compilat pe masina virtuala 
ruleaza fara probleme.

La punctul 3, orice nu contine un path valid windows nu este recunoscut 
de SetCurrentDirectory(). presupunand ca o comanda de tipul "cd 
/tmp/ceva" se executa corect prin ssh, dupa ce intru in mini-shell, ea 
esueaza.. in schimb comenzile de tipul "cd c:/cale/care/exista" vor 
merge intotdeauna.

La punctul 4, CreateFile() poate crea orice fisier pe care de exemplu 
l-as putea crea din notepad ( folosind deci sistemul de fisiere de 
dedesubt, din windows) dar refuza cu desavarsire sa recunoasca caile 
cygwin. ( Exemplu : intru in cygwin , scriu notepad si astfel obtin o 
aplicatie deschisa de cygwin, teoretic in mediul propriu de fisiere. 
save as ma duce in caile standard Windows, daca scriu ceva de genul 
"/tmp/a.txt" bineinteles ca nu il va recunoaste. Ei bine, si tema mea se 
comporta la fel).

Practic, nu stiu ce sa ii fac cygwinului sau functiei CreateProcess 
astfel incat noile comenzi sa fie executate in mediul lui si nu in 
mediul nativ Windows.

In mod normal, as sugera testarea fara cygwin ( practic pastrand 
functionalitatea comenzilor ls, grep, etc, dar pierzand caile tipice 
linux , /etc/services ). Stiu insa ca temele de anii trecuti au mers 
corectate asa, deci evident nu fac eu ceva bine. Trebuie sa apelez 
intr-un anumit fel CreateProcess, sau aplicatia nu porneste 
corespunzator ? M-am gandit ca s-ar putea sa fie ceva legat de modul cum 
aplicatia mea mosteneste ( sau nu ) anumite atribute de la aplicatia 
parinte (cygwin) dar nu am reusit sa fac nimic in legatura cu asta.

Nu as fi atat de insistent daca tema mea nu ar merge perfect pe testele 
01-15, daca fac manual urmatoarele schimbari :
1. whoami --help ==> whoami /?
2. /tmp ==> C:\Temp ( si toate celelalte path-uri redirectate catre 
foldere sau fisiere text care exista, dupa caz )
3. $USER ==> $OS    ( windows nu defineste default $USER )
4. TOATE apelurile de tipul "./ceva" in apeluri de tipul "ceva"

Multumesc daca ati citit pana aici
Numai bine,
Dani






More information about the so mailing list