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

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

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

На рис. 7.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ этот сцСнарий с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ оТиданию.

Рис. 7.1


Π‘Π°ΠΌΠ° ΠΏΠΎ сСбС эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π°. Π’Π°ΠΌ Π½ΡƒΠΆΠ½Π° вторая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lock4.c для тСстирования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.10).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.10. ВСстированиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π°

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², установлСнныС для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… участков Ρ„Π°ΠΉΠ»Π°.

1. ΠšΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π½Π°Ρ‡Π½Π΅ΠΌ с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ объявлСний:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h>


const char *test_file = "/tmp/test_lock";

#define SIZE_TO_TRY 5

void show_lock_info(struct flock *to_show);

int main() {

 int file_desc;

 int res;

 struct flock region_to_test;

 int start_byte;

2. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ дСскриптор Ρ„Π°ΠΉΠ»Π°:

 file_desc = open(test_file, O_RDWR | O_CREAT, 0666);

 if (!file_desc) {

  fprintf(stderr, "Unable to open %s for read/write", test_file);

  exit(EXIT_FAILURE);

 }

 for (start_byte = 0; start_byte < 99; start_byte += SIZE_TO_TRY) {

3. Π—Π°Π΄Π°ΠΉΡ‚Π΅ участок Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ:

  region_to_test.l_type = F_WRLCK;

  region_to_test.l_whence = SEEK_SET;

  region_to_test.lstart = start_byte;

  region_to_test.l_len = SIZE_TO_TRY;

  region_to_test.l_pid = -1;

  printf("Testing F_WRLCK on region from %d to %d\n", start_byte, start_byte + SIZE_TO_TRY);

4. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»Π°:

  res = fcntl(file_desc, F_GETLK, &region_to_test);

  if (res == -1) {

   fprintf(stderr, "F_GETLK failed\n");

   exit(EXIT_FAILURE);

  }

  if (region_to_test.l_pid != -1) {

   printf("Lock would fail. F_GETLK returned:\n");

   showlockinfo(&region_to_test);

  } else {

   printf("F_WRLCK - Lock would succeed\n");

  }

5. Π”Π°Π»Π΅Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ тСст с раздСляСмой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ (Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅). Π‘Π½ΠΎΠ²Π° Π·Π°Π΄Π°ΠΉΡ‚Π΅ участок Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ:

  region_to_test.l_type = F_RDLCK;

  region_to_test.l_whence = SEEK_SET;

  region_to_test.l_start = start_byte;

  region_to_test.l_len = SIZE_TO_TRY;

  region_to_test.l_pid = -1;

  printf("Testing F_RDLCK on region from %d to %d\n", start_byte, start_byte + SIZE_TO_TRY);

6. Π•Ρ‰Π΅ Ρ€Π°Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»Π°:

  res = fcntl(file_desc, F_GETLK, &region_to_test);

  if (res == -1) {

   fprintf(stderr, "F_GETLK failed\n");

   exit(EXIT_FAILURE);

  }

  if (region_to_test.l_pid != -1) {

   printf("Lock would fail. F_GETLK returned:\n");

   show_lock_info(&region_to_test);

  } else {

   printf("F_RDLCK β€” Lock would succeed\n");

  }

 }

 close(file_desc);

 exit(EXIT_SUCCESS);

}

void show_lock_info(struct flock *to_show) {

 printf("\tl_type %d, ", to_show->l_type);

 printf("l_whence %d, ", to_show->l_whence);

 printf("l_start %d, (int)to_show->l_start);

 printf("l_len %d, ", (int)to_show->l_len);

 printf("l_pid %d\n", to_show->l_pid);

}

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ сначала запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ lock3, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ lock4, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ это, запустив ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ lock3 Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

$ ./lock3 &

$ process 1534 locking file

На экранС появится ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ для Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ lock3 выполняСтся Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π”Π°Π»Π΅Π΅ сразу ΠΆΠ΅ запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ lock4 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

$ ./lock4

Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π΄Π°Π»Π΅Π΅ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ пропусками для краткости:

Testing F_WRLCK on region from 0 to 5

F_WRLCK β€” Lock would succeed

Testing F_RDLCK on region from 0 to 5

F_RDLCK - Lock would succeed

...

Testing F_WRLCK on region from 10 to 15

Lock would fail. F_GETLK returned:

l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534

Testing F_RDLCK on region from 10 to 15

F_RDLCK β€” Lock would succeed

Testing F_WRLCK on region from 15 to 20

Lock would fail. F_GETLK returned:

l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534

Testing F_RDLCK on region from 15 to 20

F_RDLCK β€” Lock would succeed

...

Testing F_WRLCK on region from 25 to 30

Lock would fail. F_GETLK returned:

l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534

Testing F_RDLCK on region from 25 to 30

F_RDLCK β€” Lock would succeed

...

Testing F_WRLCK on region from 40 to 45

Lock would fail. F_GETLK returned:

l_type 1, l_whence 0, l_start 40, l_len 10, l_pid 1534

Testing F_RDLCK on region from 40 to 45

Lock would fail. F_GETLK returned:

l_type 1, l_whence 0, l_start 40, l_len 10, l_pid 1534

...

Testing F_RDLCK on region from 95 to 100

F_RDLCK - Lock would succeed

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈΠ· пяти Π±Π°ΠΉΡ‚ΠΎΠ² Π² Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lock4 Π·Π°Π΄Π°Π΅Ρ‚ структуру участка Ρ„Π°ΠΉΠ»Π° для тСстирования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° ΠΏΠΎΡ‚ΠΎΠΌ примСняСт для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ этот участок Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ для чтСния ΠΈΠ»ΠΈ записи. ВозвращаСмая информация ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Π°ΠΉΡ‚Ρ‹, относящиСся ΠΊ участку Ρ„Π°ΠΉΠ»Π°, смСщСниС ΠΎΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ запроса Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»Π΅ l_pid Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ структуры содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Π»Π°Π΄Π΅ΡŽΡ‰Π΅ΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1 (Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) ΠΈ Π·Π°Ρ‚Π΅ΠΌ провСряСт, измСнилось Π»ΠΈ ΠΎΠ½ΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Ρ‹Π·ΠΎΠ²Π° fcntl. Если участок Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΏΠΎΠ»Π΅ l_pid Π½Π΅ измСнится.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, слСдуСт Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» fcntl.h (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ /usr/include/fcntl.h) ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ l_type, Ρ€Π°Π²Π½ΠΎΠ΅ 1, Π²Ρ‹Ρ‚Π΅ΠΊΠ°Π΅Ρ‚ ΠΈΠ· опрСдСлСния F_WRLCK ΠΊΠ°ΠΊ 1, Π° Ρ€Π°Π²Π½ΠΎΠ΅ 0 ΠΈΠ· опрСдСлСния F_RDLCK ΠΊΠ°ΠΊ 0. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»Π΅ l_type, Ρ€Π°Π²Π½ΠΎΠ΅ 1, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ установлСна, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сущСствуСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π° запись, Π° ΠΏΠΎΠ»Π΅ l_type, Ρ€Π°Π²Π½ΠΎΠ΅ 0, ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ сущСствовании Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. Для Ρ‚Π΅Ρ… участков Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lock3, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны ΠΈ раздСляСмая, ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

Для Π±Π°ΠΉΡ‚ΠΎΠ² с 10-Π³ΠΎ ΠΏΠΎ 30-ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° установка раздСляСмой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, установлСнная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ lock3, Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ, Π° раздСляСмая. Для участка с 40-Π³ΠΎ ΠΏΠΎ 50-ΠΉ Π±Π°ΠΉΡ‚ нСльзя ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ lock3 Π·Π°Π΄Π°Π»Π° ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ (F_WRLCK) Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для этого участка.

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ lock4 Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lock3 Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° Π²Ρ‹Π·ΠΎΠ² sleep ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

ΠšΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠΎΡΡ‚ΡΠ·Π°ΡŽΡ‚ΡΡ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ участка Ρ„Π°ΠΉΠ»Π°. Π’Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ снова ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ lock3 для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ lock5 для ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»Π°. Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ lock5 нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² для снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.11).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.11. ΠšΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lock5.с, которая пытаСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ участки Ρ„Π°ΠΉΠ»Π° вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ состояниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… частСй Ρ„Π°ΠΉΠ»Π°.

ПослС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #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;

 struct flock region_to_lock;

 int res;

 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);

 }

Π’ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ участки Ρ„Π°ΠΉΠ»Π°, ΠΈ дСлаСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для Π½ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

 region_to_lock.l_type = F_RDLCK;

 region_to_lock.l_whence = SEEK_SET;

 region_to_lock.l_start = 10;

 region_to_lock.l_len = 5;

 printf("Process %d, trying F_RDLCK, region %d to %d\n", getpid(), (int)region_to_lock.l_start,

  (int)(region_to_lock.l_start + region_to_lock.l_len));

 res = fcntl(file_desc, F_SETLK, &region_to_lock);

 if (res == -1) {

  printf("Process %d - failed to lock region\n", getpid());

 } else {

  printf("Process %d β€” obtained lock region\n", getpid());

 }

 region_to_lock.l_type = F_UNLCK;

 region_to_lock.l_whence = SEEK_SET;

 region_to_lock.l_start = 10;

 region_to_lock.l_len = 5;

 printf("Process %d, trying F_UNLCK, region %d to %d\n", getpid(), (int)region_to_lock.l_start,

  (int)(region_to_lock.l_start + region_to_lock.l_len));

 res = fcntl(file_desc, F_SETLK, &region_to_lock);

 if (res == -1) {

  printf("Process %d β€” failed to unlock region\n", getpid());

 } else {

  printf("Process %d β€” unlocked region\n", getpid());

 }

 region_to_lock.l_type = F_UNLCK;

 region_to_lock.l_whence = SEEK_SET;

 region_to_lock.l_start = 0;

 region_to_lock.l_len = 50;

 printf("Process %d, trying F_UNLCK, region %d to %d\n", getpid()", (int)region_to_lock.l_start,

  (int)(region_to_lock.l_start + region_to_lock.l_len));