[so] [Lab2] Comportament open() cu O_CREAT și fără drept RD/WR
Călin Cruceru
crucerucalincristian at gmail.com
Wed Mar 9 12:18:23 EET 2016
2016-03-09 12:15 GMT+02:00 Călin Cruceru <crucerucalincristian at gmail.com>:
> 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.
>
Aici am vrut să zic că al doilea apel open() failează; nu se ajunge la
al doilea write().
> Î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