[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Отображение файла - Пример
Пример на следующей странице ищет в файле записей о служащих
необходимую запись и позволяет пользователю изменять значение зарплаты
служащего. Пример использует отображение файла в память и работает
следующим образом:
16-19 Открывается файл записей о служащих.
21 Используется вызов lseek(2) для получения длины файла.
22 Файл отображается в память. Адрес, возвращаемый mmap(2),
преобразуется в struct employy * и присваивается p.
26-27 Пользователь должен ввести номер записи. Правильные номера
начинаются с 1.
28-34 Если пользователь вводит номер записи меньший или равный 0,
цикл прекращается. Указание номера за пределами файла вызывает печать
сообщения об ошибке и требование повторить ввод.
35-36 Печатаются поля записи.
38-39 Пользователь вводит новое значение зарплаты.
40 msync(2) возвращается только после записи в файл.
42-43 Удаляются отображения в память и файл закрывается.
Файл: update1.c
ОТОБРАЖЕНИЕ ФАЙЛА - ПРИМЕР
. . .
10 main(int argc, char *argv[])
11 {
12 off_t size;
13 struct employee *p;
. . .
16 if ((fd = open(argv[1], O_RDWR)) == -1) {
17 perror(argv[1]);
18 exit(1);
19 }
20
21 size = lseek(fd, 0, SEEK_END);
22 p = (struct employee *)mmap(0, size,
23 PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
24
25 for(;;) {
26 printf("\nEnter record number: ");
27 scanf("%d", &recnum);
28 recnum--;
29 if (recnum < 0)
30 break;
31 if (recnum * sizeof(struct employee) >= size) {
32 printf("record %d not found\n", recnum+1);
33 continue;
34 }
35 printf("Employee: %s, salary: %d\n",
36 p[recnum].name, p[recnum].salary);
37
38 printf("Enter new salary: ");
39 scanf("%d", &p[recnum].salary);
40 msync(p, size, MS_SYNC);
41 }
42 munmap(p, size);
43 close(fd);
44 }