ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ l_pid ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ²ΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ; ΡΠΌ. ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π΄Π°Π»Π΅Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ F_GETLK ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° command.
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° Π² ΡΠ°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΠΈΠ±ΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ, Π»ΠΈΠ±ΠΎ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ. ΠΠ»Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° fcntl ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΈΡ Π²ΡΠ΅ ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ.
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ F_GETLK ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° commandΠΠ΅ΡΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° command β F_GETLK. ΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»Π΅, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΊΡΡΡ fildes (ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅). ΠΠ½Π° Π½Π΅ ΠΏΡΡΠ°Π΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ». Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π²ΡΠ·ΠΎΠ²Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ ΡΠΈΠΏΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, ΠΈ Π²ΡΠ·ΠΎΠ² fcntl Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ F_GETLK Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΡΠ±ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠ³Π»Π° Π±Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
ΠΠ½Π°ΡΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² ΡΡΡΡΠΊΡΡΡΠ΅ flock, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π² ΡΠ°Π±Π». 7.2.
Π’Π°Π±Π»ΠΈΡΠ° 7.2
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ l_type ΠΠ»ΠΈ F_RDLCK Π΄Π»Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ (ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π½ΠΈΠ΅) Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΈΠ»ΠΈ F_WRLCK Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ (Π½Π° Π·Π°ΠΏΠΈΡΡ) Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ l_whence ΠΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ: SEEK_SET, SEEK_CUR ΠΈΠ»ΠΈ SEEK_END LCK l_start ΠΠ°ΡΠ°Π»ΡΠ½ΡΠΉ Π±Π°ΠΉΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠ΅Π³ΠΎ Π²Π°Ρ ΡΡΠ°ΡΡΠΊΠ° ΡΠ°ΠΉΠ»Π° l_len ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² Π² ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠ΅ΠΌ Π²Π°Ρ ΡΡΠ°ΡΡΠΊΠ΅ ΡΠ°ΠΉΠ»Π° l_pid ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡΠΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π²ΡΠ·ΠΎΠ² Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ F_GETLK Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ°ΡΡΠΊΠ° ΡΠ°ΠΉΠ»Π°. ΠΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΡΡΡΠΊΡΡΡΡ flock, ΡΠΊΠ°Π·Π°Π² ΡΠΈΠΏ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ² ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΡΡ Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡΡ ΡΠ°ΠΉΠ»Π°. ΠΡΠ·ΠΎΠ² fcntl Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΎΡ -1. ΠΡΠ»ΠΈ Ρ ΡΠ°ΠΉΠ»Π° ΡΠΆΠ΅ Π΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΡΡΡΡΠΊΡΡΡΠ° flock ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅ Π½ΠΈΡΡΠΎ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ, ΡΡΡΡΠΊΡΡΡΠ° flock Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ² Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ F_GETLK Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΎΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ -1 Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ² Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ F_GETLK Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ (Ρ. Π΅. Π²Π΅ΡΠ½ΡΠ» Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΎΡ -1), Π²ΡΠ·Π²Π°Π²ΡΠ΅Π΅ Π΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π»ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΡΡΠΊΡΡΡΡ flock. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ l_pid ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° (Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ Π½Π°ΠΉΠ΄Π΅Π½), ΡΡΠΎ ΠΏΠΎΠ»Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΈΠ·ΠΌΠ΅Π½ΡΠ»Π°ΡΡ Π»ΠΈ ΡΡΡΡΠΊΡΡΡΠ° flock.
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ F_SETLK ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° commandΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΡΠΎΠΊ ΡΠ°ΠΉΠ»Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ fildes. Π ΡΠ°Π±Π». 7.3 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ flock (ΠΎΡΠ»ΠΈΡΠ°ΡΡΠΈΠ΅ΡΡ ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ F_GETLK).
Π’Π°Π±Π»ΠΈΡΠ° 7.3
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ l_type ΠΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ : β’ F_RDLCK β Π΄Π»Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΈΠ»ΠΈ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΠ΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ; β’ F_WRLCK β Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ; β’ F_UNLCK β Π΄Π»Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°ΡΡΠΊΠ° l_pid ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ F_GETLK, Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ ΡΡΠ°ΡΡΠΎΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² l_start, l_whence ΠΈ l_len ΡΡΡΡΠΊΡΡΡΡ flock. ΠΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π°, Π²ΡΠ·ΠΎΠ² fcntl Π²Π΅ΡΠ½Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΎΡ -1, ΠΏΡΠΈ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ -1. ΠΡΠ·ΠΎΠ² Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ F_SETLKW ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° commandΠΠΎΠΌΠ°Π½Π΄Π° F_SETLKW Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅ F_SETLK Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²ΡΠ·ΠΎΠ² Π±ΡΠ΄Π΅Ρ ΠΆΠ΄Π°ΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠ°ΠΊΠ°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡΡ. ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π²ΡΠ·ΠΎΠ² Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΡΠΈΠ³Π½Π°Π». Π‘ΠΈΠ³Π½Π°Π»Ρ ΠΌΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ Π² Π³Π»Π°Π²Π΅ 11.
ΠΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΈΡΠ°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°. Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ.
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² read ΠΈ write ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ°ΡΡΠΊΠΎΠ² ΡΠ°ΠΉΠ»Π°, ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ read ΠΈ write Π²ΠΌΠ΅ΡΡΠΎ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ freadΠΈ fwrite. ΠΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΠΈ fread ΠΈ fwrite Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π²Π½ΡΡΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΡΠΈΡΠ°Π΅ΠΌΡΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π²ΡΠ·ΠΎΠ²Π° fread Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ 100 Π±Π°ΠΉΡΠΎΠ² ΠΈΠ· ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ (ΠΈ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΠΎΡΡΠΈ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° Π±ΡΠ΄Π΅Ρ), ΡΡΠΈΡΠ°Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ 100 Π±Π°ΠΉΡΠΎΠ², ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π²ΠΎ Π²Π½ΡΡΡΠΈΠ±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠΉ Π±ΡΡΠ΅Ρ. ΠΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ fread Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ 100 Π±Π°ΠΉΡΠΎΠ², ΠΎΠ½Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π±ΡΡΠ΅ΡΠ° ΠΈ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠΈΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠΌΡ Π²ΡΠ·ΠΎΠ²Ρ read ΠΈΠ·Π²Π»Π΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π°.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, Π² ΡΠ΅ΠΌ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΎΡΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΉΠ». ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ» ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 200 Π±Π°ΠΉΡΠΎΠ² Π΄Π°Π½Π½ΡΡ , Π²ΡΠ΅ Π½ΡΠ»ΠΈ. ΠΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΡΡ 100 Π±Π°ΠΉΡΠΎΠ² ΡΠ°ΠΉΠ»Π°. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ fread Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ 100 Π±Π°ΠΉΡΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ Π³Π»Π°Π², fread Π±ΡΠ΄Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΡΡΠΈΡΡΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅, Π΄ΠΎ BUFSIZ Π±Π°ΠΉΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΈΡΠ°Π΅Ρ Π² ΠΏΠ°ΠΌΡΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Π²Π΅ΡΡ ΡΠ°ΠΉΠ», Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π²Π΅ΡΠ½Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠ΅ 100 Π±Π°ΠΉΡΠΎΠ².
ΠΠ°ΡΠ΅ΠΌ ΡΡΠ°ΡΡΡΠ΅Ρ Π²ΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°. ΠΠ½Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ write Π½Π° Π²ΡΠΎΡΡΠ΅ 100 Π±Π°ΠΉΡΠΎΠ² ΡΠ°ΠΉΠ»Π°. ΠΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π»Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠ΅ 100 Π±Π°ΠΉΡΠΎΠ². ΠΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π²ΠΎΠΉΠΊΠΈ Π² Π±Π°ΠΉΡΡ Ρ 100-Π³ΠΎ ΠΏΠΎ 199-ΠΉ, Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ», ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ. Π ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²ΡΠΎΡΡΠ΅ 100 Π±Π°ΠΉΡΠΎΠ² ΡΠ°ΠΉΠ»Π° ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ fread Π΄Π»Ρ ΠΈΡ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ»ΠΈ ΡΠΆΠ΅ Π·Π°Π½Π΅ΡΠ΅Π½Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Π² Π±ΡΡΠ΅Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ²ΠΈΠ΄ΠΈΡ 100 Π±Π°ΠΉΡΠΎΠ² Π½ΡΠ»Π΅ΠΉ, Π° Π½Π΅ 100 Π΄Π²ΠΎΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ Π½Π° ΠΆΠ΅ΡΡΠΊΠΎΠΌ Π΄ΠΈΡΠΊΠ΅. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ read ΠΈ write.
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠ²Π°ΡΡΠΌ, Π½ΠΎ Π΅Π΅ ΡΡΡΠ΄Π½Π΅Π΅ ΠΎΠΏΠΈΡΠ°ΡΡ, ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ. ΠΠΎΡΡΠΎΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.9.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.9. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° fcntlΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ lock3.Ρ. ΠΠ»Ρ ΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ: ΠΎΠ΄Π½Π° Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ Π΄ΡΡΠ³Π°Ρ Π΄Π»Ρ Π΅Π΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ.
1. ΠΠ°ΡΠ½ΠΈΡΠ΅ Ρ ΡΠ°ΠΉΠ»ΠΎΠ² include ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ :
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
const char *test_file = "/tmp/test_lock";
int main() {
int file desc;
int byte_count;
char *byte_to_write = "A";
struct flock region_1;
struct flock region_2;
int res;
2. ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ:
file_desc = open(test_file, O_RDWR | O_CREAT, 0666);
if (!file_desc) {
fprintf(stderr, "Unable to open %s for read/write\n", test_file);
exit(EXIT_FAILURE);
}
3. ΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ°ΠΉΠ»:
for (byte_count = 0; byte_count < 100; byte_count++) {
(void)write(file_desc, byte_to_write, 1);
}
4. ΠΠ°Π΄Π°ΠΉΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΡΡΠ°ΡΡΠΊΠ° region 1 Ρ 10-Π³ΠΎ Π±Π°ΠΉΡΠ° ΠΏΠΎ 30-ΠΉ:
region_1.l_type = F_RDLCK;
region_1.l_whence = SEEK_SET;
region_1.l_start = 10;
region_1.l_len = 20;
5. ΠΠ°Π΄Π°ΠΉΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΡΡΠ°ΡΡΠΊΠ° region_2 Ρ 40-Π³ΠΎ Π±Π°ΠΉΡΠ° ΠΏΠΎ 50-ΠΉ:
region_2.l_type = F_WRLCK;
region_2.l_whence = SEEK_SET;
region_2.l_start = 40;
region_2.l_len = 10;
6. Π’Π΅ΠΏΠ΅ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠΉΡΠ΅ ΡΠ°ΠΉΠ»:
printf("Process %d locking file\n", getpid());
res = fcntl(file_desc, F_SETLK, ®ion_1);
if (res == -1) fprintf(stderr, "Failed to lock region 1\n");
res = fcntl(file_desc, F_SETLK, ®ion_2);
if (res = fprintf(stderr, "Failed to lock region 2\n");
7. ΠΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ:
sleep(60);
printf ("Process %d closing file\n", getpid());
close(file_desc);
exit(EXIT_SUCCESS);
}
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π‘Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ», ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΈ Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ°ΠΉΠ» Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠ°Π»Π΅Π΅ Π·Π°Π΄Π°ΡΡΡΡ Π΄Π²Π° ΡΡΠ°ΡΡΠΊΠ°: ΠΏΠ΅ΡΠ²ΡΠΉ Ρ 10-Π³ΠΎ ΠΏΠΎ 30-ΠΉ Π±Π°ΠΉΡ Π΄Π»Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ Π²ΡΠΎΡΠΎΠΉ Ρ 40-Π³ΠΎ ΠΏΠΎ 50-ΠΉ Π±Π°ΠΉΡ Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΠ·ΠΎΠ² fcntl Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π½Π° Π΄Π²Π° ΡΡΠ°ΡΡΠΊΠ° ΡΠ°ΠΉΠ»Π° ΠΈ ΠΆΠ΄Π΅Ρ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΈΠ½ΡΡΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π·Π°ΠΊΡΡΡΡ ΡΠ°ΠΉΠ» ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ.