[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