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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 52

Автор Уильям БтивСнс

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° flock описываСт Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись) ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. Как ΠΈ Π² 1 seek, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ сдвиг прСдставляСт собой сдвиг ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Ρ‡Π°Π»Π° Ρ„Π°ΠΉΠ»Π°, Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ полоТСния ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, ΠΈ интСрпрСтируСтся Π² зависимости ΠΎΡ‚ значСния поля l_whence (SEEK_SET, SEEK_CUR, SEEK_END).

ПолС l_len ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 соотвСтствуСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΎΡ‚ l_start Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π²Π° способа Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ:

1. Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ l_whence = SEEK_SET, l_start = 0 ΠΈ l_len = 0.

2. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ lseek, Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ l_whence = SEEK_CUR, l_start = 0 ΠΈ l_len = 0.

Π§Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ прСдусматриваСт СдинствСнный Π²Ρ‹Π·ΠΎΠ² (fcntl β€” см. Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.10).

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

ВсС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, установлСнныС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ процСссом, ΡΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ дСскриптора Ρ„Π°ΠΉΠ»Π° этим процСссом ΠΈ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ процСссом ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ fork.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

БнятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса обСспСчиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ записСй fcntl ΠΈ (Π² качСствС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ возмоТности) для сСмафоров System V. Для Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдств синхронизации (Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния-записи ΠΈ сСмафоров Posix) автоматичСскоС снятиС ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса Π½Π΅ прСдусматриваСтся. Об этом ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°Π·Π΄Π΅Π»Π° 7.7. 

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записСй Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ со стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π‘ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read ΠΈ write, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ВСрнСмся ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΈΠ· листинга 9.2 ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ my_lock ΠΈ my_unlock ΠΈΠ· листинга 9.1 Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ записСй Posix. ВСкст этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 9.3.

Листинг 9.3. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записСй fcntl ΠΏΠΎ стандарту Posix

//lock/lockfcntl.c

1  #include "unpipc.h"


2  void

3  my_lock(int fd)

4  {

5   struct flock lock;

6   lock.l_type = F_WRLCK;

7   lock.l_whence = SEEK_SET;

8   lock.l_start = 0;

9   lock.l_len = 0; /* Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСго Ρ„Π°ΠΉΠ»Π° Π½Π° запись */

10  Fcntl(fd, F_SETLKW, &lock);

11 }


12 void

13 my_unlock(int fd)

14 {

15  struct flock lock;

16  lock.l_type = F_UNLCK;

17  lock.l_whence = SEEK_SET;

18  lock.l_start = 0;

19  lock.l_len = 0; /* Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСго Ρ„Π°ΠΉΠ»Π° */

20  Fcntl(fd. F_SETLK, &lock);

21 }

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ устанавливаСм Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° запись, Ρ‡Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ процСсса (см. ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.4). ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ F_SETLKW, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса ΠΏΡ€ΠΈ нСвозмоТности установки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Зная ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структуры flock, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ структуру my_lock ΠΊΠ°ΠΊ

static struct flock lock = { F_WRLCK, SEEK_SET, 0, 0, 0 };

Π½ΠΎ это Π½Π΅Π²Π΅Ρ€Π½ΠΎ. Posix опрСдСляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля структуры, Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… порядок ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅.

ΠœΡ‹ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏpoΠ³Ρ€aΠΌΠΌΡ‹, Π½ΠΎ ΠΎΠ½Π°, судя ΠΏΠΎ всСму, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π΄Π°Π΅Ρ‚ возмоТности ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ Π½Π΅Ρ‚ ошибок. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ оказываСтся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ с ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ. Но ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΅Ρ‰Π΅ Π½ΠΈ ΠΎ Ρ‡Π΅ΠΌ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚. Π―Π΄Ρ€ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сначала ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π·Π°Ρ‚Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, ΠΈ Ссли ΠΎΠ½ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ возмоТности ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡˆΠ°Π½ΡΡ‹ обнаруТСния ошибки ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ увСличивался 10000 Ρ€Π°Π·, ΠΈ запустив 20 экзСмпляров ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Если Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° Π² Ρ„Π°ΠΉΠ»Π΅ Π±Ρ‹Π»ΠΎ 1, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ всСх этих процСссов ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² Ρ„Π°ΠΉΠ»Π΅ число 200001.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макросов

Π’ листингС 9.3 установка ΠΈ снятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈ ΡˆΠ΅ΡΡ‚ΡŒ строк ΠΊΠΎΠ΄Π°. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ мСсто ΠΏΠΎΠ΄ структуру, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ fcntl. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сСмь макросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ взяты ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 12.3 [21]:

#define read_lock(fd, offset, whence, len) \

 lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)

#define readw_lock(fd, offset, whence, len) \

 lock_reg(fd, F_SETLKW, F_RDlCK, offset, whence, len)

#define write_lock(fd, offset, whence, len) \

 lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)

#define writew_lock(fd, offset, whence, len) \

 lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)

#define un_lock(fd, offset, whence, len) \

 lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)

#define is_read_lockable(fd, offset, whence, len) \

 lock_test(fd, F_RDLCK, offset, whence, len)

#define is_write_lockable(fd, offset, whence, len) \

 lock_test(fd, F_WRLCK, offset, whence, len)

Π­Ρ‚ΠΈ макросы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ наши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lock_reg ΠΈ lock_test, тСкст ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингах 9.4 ΠΈ 9.5. Π‘ Π½ΠΈΠΌΠΈ Π½Π°ΠΌ ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ структур ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ сдСланы ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ трСмя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lseek.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСм Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ, Lock_reg ΠΈ Lock_test, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ ошибки fcntl, ΠΈ сСмь макросов с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ с Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²Ρ‹Ρ… макросов ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ my_lock ΠΈ my_unlock ΠΈΠ· листинга 9.3 ΠΊΠ°ΠΊ

#define my_lock(fd) (Writew_lock(fd, 0, SEEK_SET, 0))

#define my_unlock(fd) (Un_lock(fd, 0, SEEK_SET, 0))

Листинг 9.4. Π’Ρ‹Π·ΠΎΠ² fcntl для получСния ΠΈ снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

//lib/lock_reg.c

1  #include "unpipc.h"


2  int

3  lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)

4  {

5   struct flock lock;

6   lock.l_type = type; /* F_RDLCK, F_WRLCK, F_UNLCK */

7   lock.l_start = offset; /* сдвиг ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ l_whence */

8   lock.l_whence = whence; /* SEEK SET. SEEK CUR, SEEK END */

9   lock.l_len = len; /* количСство Π±Π°ΠΉΡ‚ΠΎΠ² (0 – Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°) */

10  return(fcnt(fd, cmd, &lock)"); /* –1 Π² случаС ошибки */

11 }

Листинг 9.5. Π’Ρ‹Π·ΠΎΠ² fcntl для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ состояния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

//lib/lock_test.c

1  #include "unpipc.h"


2  pid_t

3  lock_test(int fd, int type, off_t offset, int whence, off_t len)

4  {

5   struct flock lock;

6   lock.l_type = type; /* F_RDLCK or F_WRLCK */

7   lock.l_start = offset; /* сдвиг ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ l_whence */

8   lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */

9                      lock.l_len = len; /* количСство Π±Π°ΠΉΡ‚ΠΎΠ². 0 – Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π° */

10 if (fcntl(fd, F_GETLK, &lock) == –1)

11 return(-1); /* нСпрСдвидСнная ошибка */

12 if (lock.l_type == F_UNLCK)

13 return(0); /* false, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом */

14 return(lock.l_pid); /* true, возвращаСтся ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ PID процСсса. Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎ рСсурс */

15 }

9.4. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° записСй ΠΏΠΎ стандарту Posix называСтся Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. Π―Π΄Ρ€ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΠΎ всСх Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ процСссами Ρ„Π°ΠΉΠ»Π°Ρ…, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ запись Π² Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ процСсс. Π―Π΄Ρ€ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° запись. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (advisory lock) ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ своСму ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ (Ссли Ρƒ Π½Π΅Π³ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись).

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ подходят для ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ… процСссов (cooperating processes). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ… процСссов ΡΠ²Π»ΡΡŽΡ‚ΡΡ сСтСвыС Π΄Π΅ΠΌΠΎΠ½Ρ‹: всС ΠΎΠ½ΠΈ находятся ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ систСмного администратора. Пока Π² Ρ„Π°ΠΉΠ», содСрТащий порядковый Π½ΠΎΠΌΠ΅Ρ€, Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π° запись, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ процСсс Π½Π΅ смоТСт Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π½Π΅ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ процСссы

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, запустив Π΄Π²Π° экзСмпляра нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… (lockfcntl) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· листинга 9.3 ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ (locknone) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· листинга 9.1 ΠΈ Π½Π΅ устанавливаСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ:

solaris % lockfcntl & locknone &

lockfcntl: pid = 18816, seq# = 1