[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Создание файла информации о служащих - Пример

Программа создает "записи" о служащих. Структура employee определена в
файле:
employee.h:

 1 #define NAMESIZE  24
 2
 3 struct employee {
 4    char name[NAMESIZE];
 5    int salary;
 6 };

Каждой записи предшествует заголовок, содержащий дату/время создания
записи и идентификатор пользователя, создавшего запись. Заголовок
определен в файле:
empheader.h:

 1 struct recheader {
 2      char date[24];
 3      uid_t uid;
 4 };
 5 static void init_header(struct recheader *);

Программа работает следующим образом:
8-10 Перечисляются некоторые включаемые файлы. <sys/uio.h> содержит
описание структуры для struct iovec.
15-16     Объявляются структуры данных записи о служащих и заголовок.
17   Объявляется массив из двух struct iovec.
23-27     Создается файл, имя которого задается первым аргументом
(если он не существует). Если файл существует, open(2) завершается
неуспехом и выдается сообщение об ошибке. Поскольку используется
O_SYNC, writev(2) в строке 42 будет ждать завершения физической
записи.
29-32     Инициализируются элементы массива iov - подставляются
корректные адреса буферов и длины областей памяти.
34   Эта функция инициализирует заголовок.
36-42     Этот цикл создает запись о служащем на основе информации,
поступающей со стандартного ввода. Заголовок и структура данных
записываются в файл, заданный в командной строке.
Файл: create.c
              СОЗДАНИЕ ФАЙЛА ЗАПИСЕЙ О СЛУЖАЩИХ - ПРИМЕР

 8 #include <sys/uio.h>
 9 #include "employee.h"
10 #include "empheader.h"
11
12 main(int argc, char *argv[])
13 {
14     int fd;
15     struct employee record;
16     struct recheader header;
17     struct iovec iov[2];
...
23     if ((fd = open(argv[1], O_WRONLY | O_CREAT |
24     O_SYNC | O_EXCL, 0640)) == -1) {
25     perror(argv[1]);
26     exit(2);
27     }
28
29     iov[0].iov_base = (caddr_t)&header;
30     iov[1].iov_base = (caddr_t)&record;
31     iov[0].iov_len = sizeof(header);
32     iov[1].iov_len = sizeof(record);
33
34     init_header(&header);
35
36     for (;;) {
37     printf("Enter employee name <SPACE> salary: ");
38     scanf("%s", record.name);
39     if (record.name[0] == '.')
40         break;
41     scanf("%d", &record.salary);
42     writev(fd, iov, 2);
43     }
44     close(fd);
45     exit(0);
46 }