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

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

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

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

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image022.jpg

Рис. 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 Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

$ <b>./lock3 &amp;</b>

$ process 1534 locking file

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

$ <b>./lock4</b>

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

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: