[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Изменение записи - Пример

Эта программа аналогична примеру, приведенному ранее в этом разделе.
Только теперь вместо fcntl(2) используется lockf(3C).
Программа работает следующим образом:
   ...    Файл служащих открывается для чтения и записи. После входа в
          цикл for вводится номер записи.

   28     Позиция файла устанавливается на запись.

   29-32  Запись захватывается  по изменению.  lockf(3C)  блокируется,
          если запись уже захвачена.

   33-37  Запись  читается.   Если  запись   не  найдена,   печатается
          сообщение об  ошибке и  запись освобождается. Так как запись
          не была  прочитана, позиция  в файле не изменилась и не надо
          вызывать lseek(2) перед lockf(3C).

   ...    После печати имени и оклада служащего вводится новый оклад.

   44-45  Текущая позиция  файла устанавливается  на начало  записи  и
          запись изменяется.

   47-48  Запись освобождается.

Файл: update3.c
                      ИЗМЕНЕНИЕ ЗАПИСИ - ПРИМЕР
                      ЗАХВАТ ЗАПИСИ ПО ИЗМЕНЕНИЮ
 1 #include <sys/types.h>
 2 #include <stdlib.h>
 3 #include <stdio.h>
 4 #include <unistd.h>
 5 #include <fcntl.h>
 6 #include "employee.h"
 7
 8 main(int argc, char *argv[])
 9 {
...
28       lseek(fd, position, SEEK_SET);
29       if (lockf(fd, F_LOCK, sizeof(record)) == -1) {
30            perror(argv[1]);
31            exit(2);
32       }
33       if (read(fd, &record, sizeof(record)) == 0) {
34            printf("record %d not found\n", recnum);
35            lockf(fd, F_ULOCK, sizeof(record));
36            continue;
37       }
...
44       lseek(fd, position, SEEK_SET);
45       write(fd, &record, sizeof(record));
46
47       lseek(fd, position, SEEK_SET);
48       lockf(fd, F_ULOCK, sizeof(record));
...
51 }