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