Читаем Основы программирования в Linux полностью

  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 не изменится.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже