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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 130

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ аспСкты Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²:

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записСй

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записи являСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ части Ρ„Π°ΠΉΠ»Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ»Ρ‹ Unix ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π±Π°ΠΉΡ‚ΠΎΠ², Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° (range lock), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ осущСствляСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π±Π°ΠΉΡ‚ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записСй» ΠΎΠ±Ρ‰Π΅ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° всСго Ρ„Π°ΠΉΠ»Π°

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° всСго Ρ„Π°ΠΉΠ»Π°, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ вСсь Ρ„Π°ΠΉΠ», Π΄Π°ΠΆΠ΅ Ссли Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ мСняСтся Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ BSD прСдусматриваСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ лишь всСго Ρ„Π°ΠΉΠ»Π°. Для блокирования всСго Ρ„Π°ΠΉΠ»Π° с использованиСм интСрфСйса POSIX ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½ΡƒΠ»Π΅Π²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ. Π­Ρ‚ΠΎ интСрпрСтируСтся особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠ°ΠΊ «вСсь Ρ„Π°ΠΉΠ»Β».

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ запись Π² Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… для чтСния участков, Π΄Π°ΠΆΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΉ области Ρ„Π°ΠΉΠ»Π°, Π½Π΅ ΠΌΠ΅ΡˆΠ°ΡŽΡ‰ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ осущСствляСтся лишь доступ ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записи

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записи прСдоставляСт ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ записываСмой области. Если эта ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ для чтСния, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записи Π»ΠΈΠ±ΠΎ блокируСтся, Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ Π² зависимости ΠΎΡ‚ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. ПослС получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записи ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ.

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (advisory lock) тСсно соотвСтствуСт Π·Π°ΠΌΠΊΡƒ Π½Π° Π΄Π²Π΅Ρ€ΠΈ. Говорят, Β«Π·Π°ΠΌΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ для чСстных людСй», Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π° самом Π΄Π΅Π»Π΅ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ Π²Π»ΠΎΠΌΠΈΡ‚ΡŒΡΡ Π² ваш Π΄ΠΎΠΌ, ΠΎΠ½, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΉΠ΄Π΅Ρ‚ способ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, нСсмотря Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΌΠΊΠ° Π² Π΄Π²Π΅Ρ€ΠΈ. Π’ΠΎ ΠΆΠ΅ ΠΈ со Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ; ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ лишь Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, сначала пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Однако, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ с Ρ„Π°ΠΉΠ»ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠΎΠΊΠ° это Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€Π°Π²Π°ΠΌΠΈ допуска Ρ„Π°ΠΉΠ»Π°).

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° являСтся Π±ΠΎΠ»Π΅Π΅ строгой: ΠΊΠΎΠ³Π΄Π° установлСна ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ. Π›ΡŽΠ±ΠΎΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пытаСтся ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это, Π»ΠΈΠ±ΠΎ сам блокируСтся Π΄ΠΎ снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°, Π»ΠΈΠ±ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ. (Под GNU/Linux ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ это Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ root!)

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° достаточна для Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΠ³Π΄Π° Π½Π΅ прСдполагаСтся использованиС этого Ρ„Π°ΠΉΠ»Π° Π½ΠΈ ΠΎΠ΄Π½ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ситуации, ΠΊΠΎΠ³Π΄Π° ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° Π² использовании Ρ„Π°ΠΉΠ»Π° являСтся критичСским, ΠΊΠ°ΠΊ Π² коммСрчСских систСмах Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

POSIX стандартизуСт лишь Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° доступна Π½Π° GNU/Linux, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² рядС коммСрчСских систСм Unix, Π½ΠΎ Π΄Π΅Ρ‚Π°Π»ΠΈ Π²Π°Ρ€ΡŒΠΈΡ€ΡƒΡŽΡ‚. Π”Π°Π»Π΅Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим Π΄Π΅Ρ‚Π°Π»ΠΈ для GNU/Linux.

14.2.2. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° POSIX: fcntl() ΠΈ lockf()

БистСмный Π²Ρ‹Π·ΠΎΠ² fcntl() (file control β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠΌ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°. (Π”Ρ€ΡƒΠ³ΠΎΠ΅ использованиС fcntl() Π±Ρ‹Π»ΠΎ описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.4.3 Β«Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°: fcntl()Β».) Он объявлСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

#include <unistd.h> /* POSIX */

#include <fcntl.h>


int fcntl(int fd, int cmd); /* Not relevant for file locking */

int fcntl(int fd, int cmd, long arg); /* Not relevant for file locking */

int fcntl(int fd, int cmd, struct flock *lock);

АргумСнты ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

fd ДСскриптор Ρ„Π°ΠΉΠ»Π° для ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

cmd Одна ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… констант, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² <fcntl.h>. НиТС ΠΎΠ½ΠΈ описаны Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

lock Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° struct flock, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

14.2.2.1. ОписаниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ осущСствлСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ исслСдуСм описаниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ структуры struct flock, которая описываСт Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ Π²ΠΈΠ΄ Π½ΡƒΠΆΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ struct lock содСрТит Β«ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅Β» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹. Π­Ρ‚ΠΎ позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ структуры. Из слСгка ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ справочной страницы fcntl(3):

struct flock {

 ...

 short l_type; /* Π’ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ: F_RDLCK, F_WRLCK, F_UNLCK */

 short l_whence; /* Как интСрпрСтируСтся l_start:

                    SEEK_SET, SEEK_CUR, SEEK_END */

 off_t l_start; /* ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ смСщСниС */

 off_t l_len; /* Число Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ²;

                 0 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π° */

 pid_t l_pid; /* PID Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ процСсса (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ F_GETLK) */

 ...

};

ПолС l_start являСтся смСшСниСм Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ участка. l_len являСтся Π΄Π»ΠΈΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ участка, Ρ‚. Π΅. ΠΎΠ±Ρ‰ΠΈΠΌ числом Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ². l_whence ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ мСсто Π² Ρ„Π°ΠΉΠ»Π΅, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ отсчитываСтся l_start, значСния Ρ‚Π΅ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° whence Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lseek() (см Ρ€Π°Π·Π΄Π΅Π» 4.5 Β«ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ: пСрСмСщСния Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°Β»), ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ поля. Π­Ρ‚Π° структура самодостаточна: смСщСниС l_start ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ l_whence Π½Π΅ связаны с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ для чтСния ΠΈΠ»ΠΈ записи. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΌΠΎΠ³ Π±Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

struct employee { /* Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ */ }; /* ОписаниС сотрудника */

struct flock lock; /* Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π±Π»ΠΎΠΊΠ° */

...

/* Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ структуру для ΡˆΠ΅ΡΡ‚ΠΎΠ³ΠΎ сотрудника */

lock.l_whence = SEEK_SET; /* ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ */

lock.l_start = 5 * sizeof(struct employee); /* Начало 6-ΠΉ структуры */

lock.l_len = sizeof(struct employee); /* Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ запись */

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ SEEK_CUR ΠΈΠ»ΠΈ SEEK_END, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ участки, начиная ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ смСщСния Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π° соотвСтствСнно. Для этих Π΄Π²ΡƒΡ… случаСв l_start ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, ΠΏΠΎΠΊΠ° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ Π½Π°Ρ‡Π°Π»ΠΎ Π½Π΅ мСньшС нуля. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ послСднюю запись Π² Ρ„Π°ΠΉΠ»Π΅:

/* Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запись послСднСго сотрудника */

lock.l_whence = SEEK_END; /* ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ EOF */

lock.l_start = -1 * sizeof (struct employee);

 /* Начало послСднСй структуры */

lock.l_len = sizeof(struct employee); /* Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ запись */

Установка l_len Π² 0 являСтся особым случаСм. Он ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»Π° ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ полоТСния, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ l_start ΠΈ l_whence, ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°. Бюда входят Ρ‚Π°ΠΊΠΆΠ΅ Π»ΡŽΠ±Ρ‹Π΅ области Π·Π° ΠΊΠΎΠ½Ρ†ΠΎΠΌ Ρ„Π°ΠΉΠ»Π°. (Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» увСличиваСтся Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ вСсь Ρ„Π°ΠΉΠ».) Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСго Ρ„Π°ΠΉΠ»Π° являСтся Π²Ρ‹Ρ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ случаСм блокирования ΠΎΠ΄Π½ΠΎΠΉ записи:

lock.l_whence = SEEK_SET; /* ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ */

lock.l_start = 0; /* Начало Ρ„Π°ΠΉΠ»Π° */

lock.l_len = 0; /* Π”ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π° */

Бправочная страница fnctl(3) ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

POSIX 1003.1-2001 допускаСт ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния l_len. (И Ссли это Ρ‚Π°ΠΊ, описываСмый Π±Π»ΠΎΠΊΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚Ρ‹ с l_start + l_len Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ l_start - 1 Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.) Однако, Π² этой ситуации систСмный Π²Ρ‹Π·ΠΎΠ² Linux для соврСмСнных ядСр Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ EINVAL.

(ΠœΡ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ справочная страница относится ΠΊ вСрсиям ядСр 2.4.x; стоит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ страницу, Ссли ваша систСма Π½ΠΎΠ²Π΅Π΅.)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π³Π΄Π΅ блокируСтся Ρ„Π°ΠΉΠ», ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ l_type. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

F_RDLCK  Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния. Для примСнСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для чтСния.

F_WRLCK  Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записи. Для примСнСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записи Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для записи.

F_UNLCK  ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, полная спСцификация Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ установку Π² структурС struct flock Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΠΎΠ»Π΅ΠΉ: Ρ‚Ρ€Π΅Ρ… для указания Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ области ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ³ΠΎ для описания Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π±Π»ΠΎΠΊΠ°.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ F_UNLCK для l_type снимаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, это ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ ΡΠ½ΡΡ‚ΡŒ Ρ‚Π΅ самыС Π±Π»ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ установлСны Ρ€Π°Π½Π΅Π΅, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Β«Ρ€Π°ΡΡ‰Π΅ΠΏΠΈΡ‚ΡŒΒ» Π±Π»ΠΎΠΊ, освободив Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±Π°ΠΉΡ‚ΠΎΠ² Π² сСрСдинС Ρ€Π°Π½Π΅Π΅ установлСнного Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. НапримСр:

struct employee { /* Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ */ }; /* ОписаниС сотрудника */

struct flock lock; /* Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π±Π»ΠΎΠΊΠ° */

...

/* Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сотрудников 6-8 */