Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 76

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 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, &region_1);

 if (res == -1) fprintf(stderr, "Failed to lock region 1\n");

 res = fcntl(file_desc, F_SETLK, &region_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 для установки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π½Π° Π΄Π²Π° участка Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΆΠ΄Π΅Ρ‚ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.