[<<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 }