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