ΠΡΠ»ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠ°ΠΌΠΈ flock() ΡΠ²Π»ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅:
β’ ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ flock() ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ; ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΉΡΠΈ ΠΈ ΠΈΡΠΏΠΎΡΡΠΈΡΡ Π±Π΅Π· Π²ΡΡΠΊΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ ΡΠ°ΠΉΠ», Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ flock().
β’ ΠΠ»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π²Π΅ΡΡ ΡΠ°ΠΉΠ». ΠΠ΅Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΠΈ ΡΠ°ΠΉΠ»Π°.
β’ Π’ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ» ΠΎΡΠΊΡΡΡ ΡΠ°ΠΉΠ», Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½. (Π‘ΡΠ°Π²Π½ΠΈΡΠ΅ ΡΡΠΎ Ρ fcntl(), ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠΊΡΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ, ΠΈΠ»ΠΈ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ.)
β’ ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠΊΡΡΡΡΡ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ°ΠΉΠ»Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΠ»Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ . Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ fcntl(), ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄ΡΡ Π·Π°ΠΊΡΡΡΡ Π²ΡΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»Π°.
β’ ΠΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π»ΠΈΡΡ ΠΎΠ΄Π½Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ flock(); ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² flock() Ρ Π΄Π²ΡΠΌΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° Π½ΠΎΠ²ΡΠΉ.
β’ ΠΠ° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ GNU/Linux Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ flock() ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡ ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ fcntl(). ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Unix ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ flock() Π² Π²ΠΈΠ΄Π΅ Β«ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈΒ» ΠΏΠΎΠ²Π΅ΡΡ fcntl(), Π½ΠΎ ΠΈΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ°Π΅ΡΡΡ.
ΠΡ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ flock() Π² Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΅Π΅ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ° Π½Π΅ ΡΠ°ΠΊΠ°Ρ Π³ΠΈΠ±ΠΊΠ°Ρ ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½Π° Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π° POSIX. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π΅Π΅ Π² GNU/Linux ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π΄Π»Ρ ΡΡΠ°ΡΡΡ ΡΠΈΡΡΠ΅ΠΌ BSD Unix.
ΠΠΠΠΠ§ΠΠΠΠ. Π‘ΠΏΡΠ°Π²ΠΎΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° GNU/Linux flock(2) ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ flock() Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄Π»Ρ ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ fcntl() ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ Ρ Π²Π°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ Linux ΠΈ ΡΠ΅ΡΠ²Π΅Ρ NFS ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²
14.2.4. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΡ ΡΠΈΡΡΠ΅ΠΌ Unix ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈΡΡ Ρ fcntl(). ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ° ΡΠ°ΠΉΠ»Π°, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΏΡΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΊ ΡΠ°ΠΉΠ»Ρ Π±ΠΈΡΠ° setgid Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ chmod.
$ echo hello, world > myfile /* Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» */
$ ls -l myfile /* ΠΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° */
-rw-r--r-- 1 arnold devel 13 Apr 3 17:11 myfile
$ chmod g+s myfile /* ΠΠΎΠ±Π°Π²ΠΈΡΡ Π±ΠΈΡ setgid */
$ ls -l myfile /* ΠΠΎΠΊΠ°Π·Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° */
-rw-r-Sr-- 1 arnold devel 13 Apr 3 17:11 myfile
ΠΠΈΡ ΠΏΡΠ°Π²Π° Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΡΠ°Π²Π»Π΅Π½ ΡΠ±ΡΠΎΡΠ΅Π½Π½ΡΠΌ. S ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π±ΠΈΡ setgid ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, Π½ΠΎ ΡΡΠΎ Π±ΠΈΡ ΠΏΡΠ°Π²Π° Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ β Π½Π΅Ρ; Π΅ΡΠ»ΠΈ Π±Ρ Π±ΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ ΠΎΠ±Π° Π±ΠΈΡΠ°, Π±ΡΠ»Π° Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° ΡΡΡΠΎΡΠ½Π°Ρ Π±ΡΠΊΠ²Π° s.
ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡΠ° setgid ΠΈ ΡΠ±ΡΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡΠ° ΠΏΡΠ°Π²Π° Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏΠΎΠΉ ΠΎΠ±ΡΡΠ½ΠΎ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ. ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅, ΠΎΠ½Π° Π±ΡΠ»Π° Π²ΡΠ±ΡΠ°Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ System V Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ». Π Π² ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ Π±ΠΈΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Unix, ΡΠ°ΠΊΡΡ ΠΊΠ°ΠΊ Solaris, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠ° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ GNU/Linux Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΡΡΠ³Π°Ρ ΠΈΡΡΠΎΡΠΈΡ. ΠΠ»Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ Π±ΠΈΡ setgid, Π½ΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ. Π€Π°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ ΡΠ°ΠΉΠ», ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½Π° Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ mand Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ mount.
ΠΡ ΡΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠ°Π·Π΄Π΅Π»Ρ Π΄ΠΈΡΠΊΠ°, ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ mount, Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 8.1 Β«ΠΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΒ». ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° Π³ΠΈΠ±ΠΊΠΎΠΌ Π΄ΠΈΡΠΊΠ΅. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π°, Π²ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°:
1 /* ch14-lockall.c --- ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. */
2
3 #include <stdio.h> /* Π΄Π»Ρ fprintf(), stderr, BUFSIZ */
4 #include <errno.h> /* ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ errno */
5 #include <fcntl.h> /* Π΄Π»Ρ ΡΠ»Π°Π³ΠΎΠ² open() */
6 #include <string.h> /* ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ strerror() */
7 #include <unistd.h> /* Π΄Π»Ρ ssize_t */
8 #include <sys/types.h>
9 #include <sys/stat.h> /* Π΄Π»Ρ mode_t */
10
11 int
12 main(int argc, char **argv)
13 {
14 int fd;
15 int i, j;
16 mode_t rw_mode;
17 static char message[] = "hello, world\n";
18 struct flock lock;
19
20 if (argc != 2) {
21 fprintf(stderr, "usage: %s file\n", argv[0]);
22 exit(1);
23 }
24
25 rw_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; / * 0644 */
26 fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT|O_EXCL, rw_mode);
27 if (fd < 0) {
28 fprintf(stderr, "%s: %s: cannot open for read/write: %s\n",
29 argv[0], argv[1], strerror(errno));
30 (void)close(fd);
31 return 1;
32 }
33
34 if (write(fd, message, strlen(message)) != strlen(message)) {
35 fprintf(stderr, "%s: %s: cannot write: %s\n",
36 argv[0], argv[1], strerror(errno));
37 (void)close(fd);
38 return 1;
39 }
40
41 rw_mode |= S_ISGID; /* Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π±ΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ */
42
43 if (fchmod(fd, rw_mode) < 0) {
44 fprintf(stderr, "%s: %s: cannot change mode to %o: %s\n",
45 argv[0], argv[1], rw_mode, strerror(errno));
46 (void)close(fd);
47 return 1;
48 }
49
50 /* Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» */
51 memset(&lock, '\0', sizeof(lock));
52 lock.l_whence = SEEK_SET;
53 lock.l_start = 0;
54 lock.l_len =0; /* Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° */
55 lock.l_type = F_WRLCK; /* Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ */
56
57 if (fcntl(fd, F_SETLK, &lock) < 0) {
58 fprintf(stderr, "%s: %s: cannot lock the file: %s\n",
59 argv[0], argv[1], strerror(errno));
60 (void)close(fd);
61 return 1;
62 }
63
64 pause();
65
66 (void)close(fd);
67
68 return 0;
69 }
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ», ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ (ΡΡΡΠΎΠΊΠΈ 25 ΠΈ 26). ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½Π° Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΡΠ°ΠΉΠ» Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ (ΡΡΡΠΎΠΊΠ° 34). Π‘ΡΡΠΎΠΊΠ° 41 Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΊ ΠΏΡΠ°Π²Π°ΠΌ Π΄ΠΎΡΡΡΠΏΠ° Π±ΠΈΡ setgid, Π° ΡΡΡΠΎΠΊΠ° 43 ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΈΡ . (Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² fchmod() ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 5.5.2 Β«ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ°: chmod() ΠΈ fchmod()Β».)
Π‘ΡΡΠΎΠΊΠΈ 51β55 ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ struct flock Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°, Π° Π·Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π°Π»ΡΠ½ΠΎ Π² ΡΡΡΠΎΠΊΠ΅ 57. ΠΡΠΏΠΎΠ»Π½ΠΈΠ² Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΡΡΠΏΠ°Π΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² pause() (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 10.7 Β«Π‘ΠΈΠ³Π½Π°Π»Ρ Π΄Π»Ρ ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡΒ»). ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ. ΠΠΎΡ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ° Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²:
$ fdformat /dev/fd0 /* Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ Π³ΠΈΠ±ΠΊΠΈΠΉ Π΄ΠΈΡΠΊ */
Double -sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
$ /sbin/mke2fs /dev/fd0 /* Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Linux */
/* ...ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΠ²ΠΎΠ΄Π° ΠΎΠΏΡΡΠ΅Π½ΠΎ... */
$ su /* Π‘ΡΠ°ΡΡ root, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ mount */
Password: /* ΠΠ°ΡΠΎΠ»Ρ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ */
# mount -t ext2 -ΠΎ mand /dev/fd0 /mnt/floppy /* Π‘ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°ΡΡ Π³ΠΈΠ±ΠΊΠΈΠΉ
Π΄ΠΈΡΠΊ, Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ */
# suspend /* ΠΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ root */
[1]+ Stopped su
$ ch14-lockall /mnt/floppy/x & /* Π€ΠΎΠ½ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° */
[2] 23311 /* ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ */
$ ls -l /mnt/floppy/x /* ΠΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°ΠΉΠ» */
-rw-r-Sr-- 1 arnold devel 13 Apr 6 14:23 /mnt/floppy/x
$ echo something > /mnt/floppy/x /* ΠΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΉΠ» */
bash2: /mnt/floppy/x: Resource temporarily unavailable
/* ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° */
$ kill %2 /* ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ */
$ /* ΠΠ°ΠΆΠ°ΡΡ ENTER */
[2]- Terminated ch14-lockall /mnt/floppy/x /* ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½Π° */
$ echo something > /mnt/floppy/x /* ΠΠΎΠ²Π°Ρ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ */
$ fg /* ΠΠ΅ΡΠ½ΡΡΡΡΡ Π² ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ root */
su
# umount /mnt/floppy /* ΠΠ΅ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°ΡΡ Π³ΠΈΠ±ΠΊΠΈΠΉ Π΄ΠΈΡΠΊ */
# exit /* Π Π°Π±ΠΎΡΠ° Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΎΠΉ root Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½Π° */
$
ΠΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ch14-lockall, ΠΎΠ½Π° Π²Π»Π°Π΄Π΅Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ. ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ch14-lockall Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡΡ, ΠΈ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΡΠ΅Π»ΠΈ. ΠΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ ΡΠ°Π½Π΅Π΅, ΠΏΠΎΠ΄ GNU/Linux Π΄Π°ΠΆΠ΅ root Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π°.
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠΊΠ»ΠΎΠ½ΡΡΡΡ Π² ΡΡΠΎΡΠΎΠ½Ρ, Π³ΠΈΠ±ΠΊΠΈΠ΅ Π΄ΠΈΡΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΈΡΠΏΡΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΠ΅Π½Π΄ Π΄Π»Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ Π²Ρ ΡΠ΄Π΅Π»Π°Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ, ΡΡΠΎ ΡΠ°Π·ΡΡΡΠΈΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π³ΠΈΠ±ΠΊΠΎΠΌ Π΄ΠΈΡΠΊΠ΅, ΡΡΠΎ Π²ΡΡΠ΄ Π»ΠΈ Π±ΡΠ΄Π΅Ρ ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΌ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠΌΠΈ ΡΠ°Π·Π΄Π΅Π»Π°ΠΌΠΈ Π½Π° ΠΎΠ±ΡΡΠ½ΡΡ ΠΆΠ΅ΡΡΠΊΠΈΡ Π΄ΠΈΡΠΊΠ°Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΊΠΎΠ²Π°Π½Π½ΠΎ.