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

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

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

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

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

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

...

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

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

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

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

/* ...установка Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (см. ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»)... */

/* ОсвобоТдСниС записи 7: ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ расщСпляСтся Π½Π° Π΄Π²Π°: */

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

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

lock.l_len = sizeof(struct employee) * 1; /* Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 1-ΠΉ записи */

/* ...снятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (см. ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»)... */

14.2.2.2. Установка ΠΈ снятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ

ПослС заполнСния структуры struct flock ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом являСтся запрос Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΎΡ‚ шаг осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° cmd Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fcntl():

F_GETLK   Π£Π·Π½Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ.

F_SETLK   Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΠ½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ.

F_SETLKW  Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Π², ΠΏΠΎΠΊΠ° это Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ.

Команда F_GETLK являСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ «Мама, ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ½Π΅?Β» Она освСдомляСтся, доступна Π»ΠΈ описанная struct flock Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°. Если ΠΎΠ½Π° доступна, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ устанавливаСтся; вмСсто этого опСрационная систСма измСняСт ΠΏΠΎΠ»Π΅ l_type Π½Π° F_UNLCK. Π”Ρ€ΡƒΠ³ΠΈΠ΅ поля ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° нСдоступна, опСрационная систСма заполняСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ поля свСдСниями, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΡƒΠΆΠ΅ установлСнныС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ установкС Π½ΠΎΠ²ΠΎΠΉ. Π’ этом случаС l_pid содСрТит PID процСсса, Π²Π»Π°Π΄Π΅ΡŽΡ‰Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ.[152] Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΡƒΠΆΠ΅ установлСна, Π½Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π°, ΠΊΡ€ΠΎΠΌΠ΅ оТидания Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ установки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎΠ± ошибкС ΠΈ ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ.

Команда F_SETLK пытаСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Если fcntl() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π±Ρ‹Π»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ установлСна. Если ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ установил Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс. Π’ этом случаС Π² errno устанавливаСтся Π»ΠΈΠ±ΠΎ EAGAIN (ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ снова ΠΏΠΎΠ·ΠΆΠ΅) ΠΈΠ»ΠΈ EACCESS (Π½Π΅Ρ‚ доступа). Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Π΄Π²Π° значСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ старым систСмам.

Команда F_SETLKW Ρ‚Π°ΠΊΠΆΠ΅ пытаСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Она отличаСтся ΠΎΡ‚ F_SETLK Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° установка Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ окаТСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ.

Π’Ρ‹Π±Ρ€Π°Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° cmd, ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° fcntl() вмСстС с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡƒΡŽ структуру struct flock Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°:

struct flock lock;

 int fd;

 /* ...ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ», Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ struct flock... */

 if (fcntl(fd, F_SETLK, &lock) < 0) {

 /* Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ */

}

Ѐункция lockf()[153] прСдоставляСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ установки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°.

#include <sys/file.h> /* XSI */


int lockf(int fd, int cmd, off_t len);

ДСскриптор Ρ„Π°ΠΉΠ»Π° fd Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для записи. len ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ число Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ²: ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ полоТСния (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ pos) Π΄ΠΎ pos + len Π±Π°ΠΉΡ‚ΠΎΠ², Ссли len ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΠ»ΠΈ ΠΎΡ‚ pos - len Π΄ΠΎ pos - 1, Ссли len ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

F_LOCK   Π£ΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π’Ρ‹Π·ΠΎΠ² блокируСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π½Π΅ станСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ.

F_TLOCK  ΠŸΡ‹Ρ‚аСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° F_LOCK, Π½ΠΎ Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° нСдоступна, F_TLOCK Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

F_ULOCK  Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π». Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ расщСплСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠ°ΠΊ описано Π²Ρ‹ΡˆΠ΅.

F_TEST   ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, доступна Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°. Если доступна, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 ΠΈ устанавливаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1 ΠΈ устанавливаСт Π² errno EACCESS.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 0 Π² случаС успСха ΠΈ -1 ΠΏΡ€ΠΈ ошибкС, с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² errno. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния ошибок Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

EAGAIN Π€Π°ΠΉΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, для F_TLOCK ΠΈΠ»ΠΈ F_TEST.

EDEADLK Для F_TLOCK эта опСрация создала Π±Ρ‹ Ρ‚ΡƒΠΏΠΈΠΊ.[154]

ENOLCK ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма Π½Π΅ смогла Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ.

ПолСзна комбинация F_TLOCK ΠΈ EDEADLK: Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΠΏΠΈΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½ΠΈΠΊΠΎΠ³Π΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ F_LOCK. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, стоит ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡ‚ΡŒ сСбя ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ F_TLOCK. Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° доступна, ΠΎΠ½Π° осущСствляСтся, Π½ΠΎ Ссли Π½Π΅Ρ‚, Ρƒ вас появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ восстановлСния вмСсто блокирования Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°Π²Π΅Ρ‡Π½ΠΎ.

Π—Π°Π²Π΅Ρ€ΡˆΠΈΠ² Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ участком, Π΅Π³ΠΎ слСдуСт ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ. Для fcntl() Π²ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ struct lock, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ для блокирования, ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅ l_type Π½Π° F_UNLCK. Π—Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ F_SETLK Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° cmd:

lock.l_whence = ... ; /* Как Ρ€Π°Π½ΡŒΡˆΠ΅ */

lock.l_start = ... ; /* Как Ρ€Π°Π½ΡŒΡˆΠ΅ */

lock.l_len = ... ; /* Как Ρ€Π°Π½ΡŒΡˆΠ΅ */

lock.l_type = F_UNLCK; /* Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ */

if (fcntl(fd, F_SETLK, &lock) < 0) {

 /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ */

}

/* Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π±Ρ‹Π»Π° снята */

Код, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ lockf(), нСсколько ΠΏΡ€ΠΎΡ‰Π΅. Для краткости ΠΌΡ‹ опустили ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ошибок:

off_t curpos, len;

curpos = lseek(fd, (off_t)0, SEEK_CUR); /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ */

len = ... ; / * Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ число Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² */

lockf(fd, F_LOCK, len); / * ΠžΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ */

/* ...здСсь использованиС Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ участка... */

lseek(fd, curpos, SEEK_SET); / * Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ */

lockf(fd, F_ULOCK, len); /* Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» */

Если Π²Ρ‹ Π½Π΅ освободитС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, опСрационная систСма сдСлаСт это Π·Π° вас Π² Π΄Π²ΡƒΡ… случаях. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ случай, ΠΊΠΎΠ³Π΄Π° процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ (Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΈΠ· main(), Π»ΠΈΠ±ΠΎ с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit(), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ рассматривали Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.1.5.1 Β«ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ статуса Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса»). Π”Ρ€ΡƒΠ³ΠΈΠΌ случаСм являСтся Π²Ρ‹Π·ΠΎΠ² close() с дСскриптором Ρ„Π°ΠΉΠ»Π°: большС ΠΎΠ± этом Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

14.2.2.3. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ нСсколько прСдостСрСТСний, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²:

β€’ ΠšΠ°ΠΊ описано Ρ€Π°Π½Π΅Π΅, Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° являСтся ΠΈΠΌΠ΅Π½Π½ΠΎ этим. НС Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚, Π·Π° спиной (Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ) процСсса, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ.

β€’ Π­Ρ‚ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² сочСтании с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ <stdio.h>. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° осущСствляСт своС собствСнноС Π±ΡƒΡ„Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π₯отя Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fileno() дСскриптор Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ².

β€’ Π”Π΅Ρ€ΠΆΠΈΡ‚Π΅ Π² ΡƒΠΌΠ΅, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ послС fork Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌΠΈ процСссами, Π½ΠΎ ΠΎΠ½ΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π° своСм мСстС послС exec.

β€’ Π’Ρ‹Π·ΠΎΠ² close() с Π»ΡŽΠ±Ρ‹ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ для Ρ„Π°ΠΉΠ»Π° дСскриптором удаляСт всС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° процСссом, Π΄Π°ΠΆΠ΅ Ссли Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дСскрипторы для Ρ„Π°ΠΉΠ»Π° ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ.

Π’ΠΎ, Ρ‡Ρ‚ΠΎ close() Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, являСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊ Π±Ρ‹Π»Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π² fcntl(), POSIX Π΅Π΅ стандартизуСт. Бтандартизация Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‡ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° для Unix.

14.2.3. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ BSD: flock()

4.2 BSD прСдставило свой собствСнный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, flock()[155]. Ѐункция объявлСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

#include <sys/file.h> /* ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ */


int flock(int fd, int operation);

ДСскриптор fd прСдставляСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

LOCK_SH  Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚Π½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько совмСстных Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

LOCK_EX  Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ лишь ΠΎΠ΄Π½Π° такая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°.

LOCK_UN  Π£Π΄Π°Π»ΡΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ.

LOCK_NB  ΠŸΡ€ΠΈ использовании ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π˜Π›Π˜ с LOCK_SH ΠΈΠ»ΠΈ LOCK_EX позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ блокирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ запросы Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π½Π΅ Π΄Π°Π²Π°Ρ‚ΡŒ Π΅ΠΉ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ), Ссли сущСствуСт ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°. Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰Π°Ρ функция возвращаСтся, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° снимаСтся ΠΈ осущСствляСтся Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π°. (Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ возникновСния Ρ‚ΡƒΠΏΠΈΠΊΠ°.) Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π±Π΅Π· блокирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ посрСдством ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π˜Π›Π˜ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ LOCK_NB ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌΡƒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ operation.