[so] [Lab2] Comportament open() cu O_CREAT și fără drept RD/WR
Călin Cruceru
crucerucalincristian at gmail.com
Wed Mar 9 12:15:21 EET 2016
Salut,
Pornind de la unul dintre exercițiile din laboratorul 2[1] (Linux -
Troubleshooting) am observat un comportament al lui open()[1] pe care
nu îl înțeleg pe deplin.
Am experimentat cu codul de la [3]. Să presupunem că fișierul "test"
nu există atunci când se rulează programul. Comportamentul care mi se
pare ciudat este legat de faptul că primul apel write() se termină cu
succes - în mod surprinzător pentru mine, iar al doilea failează - așa
cum mă aștept.
În timp ce scriam acest e-mail am citit în manualul open()[2], la
flag-ul O_CREAT, următorul lucru:
O_CREAT - [...]; the open() call that creates a read-only file may
well return a read/write file descriptor.
Asta explică pe de-o parte comportamentul, deși rămân cu 2 întrebări:
1. De ce?
2. *may* înseamnă că nu te poți baza pe asta? Probabil că nu vrei
niciodată să faci ceva asemănător, dar vreau să înțeleg de ce s-a ales
această funcționare.
Pe lângă asta, nu reușesc să reproduc funcționalitatea ":w!" din VI
atunci când se deschide un fișier cu aceleași drepturi (000). Dacă
fișierul e creat de mine (eu sunt owner-ul), pot modifica fișierul
chiar dacă drepturile sunt 000.
Am folosit strace pentru a urmări apelurile open(), iar apelul care se
face cu succes atunci când folosesc ":w!" este
open("test", O_WRONLY|O_CREAT|O_TRUNC, 0200) = 5
însă nu înțeleg de ce se face cu succes acest apel. Nu ar trebui să
eșueze dacă fișierul deja există și are drepturi 000? M-am gândit și
că poate îl șterge înainte și se bazează pe funcționalitatea O_CREAT
citată mai sus, dar atunci m-aș aștepta să îi schimbe drepturile în
200, dar ele rămân la fel (cel puțin pe mașina mea).
[1]: http://ocw.cs.pub.ro/courses/so/laboratoare/laborator-02
[2]: http://linux.die.net/man/2/open
[3]: https://paste.kde.org/pelfmniqm
Mersi,
Călin
More information about the so
mailing list