Linux программирование в примерах | страница 72
4.1. Введение в модель ввода/вывода Linux/Unix
Модель API Linux/Unix для ввода/вывода проста. Ее можно суммировать четырьмя словами. открыть, прочитать, записать, закрыть. Фактически, это имена системных вызовов: >open()
, >read()
, >write()
, >close()
. Вот их объявления:
>#include
>#include
>#include
>#include
>int open(const char *pathname, int flags, mode_t mode);
>ssize_t read(int fd, void *buf, size_t count);
>ssize_t write(int fd, const void *buf, size_t count);
>int close(int fd);
В следующем и дальнейших разделах мы проиллюстрируем модель, написав очень простую версию >cat
. Она так проста, что даже не имеет опций; все, что она делает, — объединяет содержимое двух именованных файлов и выводит его в стандартный вывод. Она выводит минимум сообщений об ошибках. Написав, мы сравним ее с V7 >cat
.
Мы представим программу сверху вниз, начав с командной строки. В последующих разделах мы представим обработку ошибок, а затем перейдем к сущностным задачам, показав, каким образом осуществляется реальный файловый ввод/вывод.
4.2. Представление базовой структуры программы
Наша версия cat следует структуре, которая обычно является полезной. Первая часть начинается с комментариев, заголовочных файлов, объявлений и функции main():
>1 /*
>2 * ch04-cat.c --- Демонстрация open(), read(), write(), close(),
>3 * errno и strerror().
>4 */
>5
>6 #include
>7 #include
>8 #include
>9 #include
>10 #include
>11 #include
>12 #include
>13
>14 char *myname;
>15 int process(char *file);
>16
>17 /* main --- перечислить аргументы файла */
>18
>19 int
>20 main(int argc, char **argv)
>21 {
>22 int i;
>23 int errs = 0;
>24
>25 myname = argv[0];
>26
>27 if (argc == 1)
>28 errs = process("-");
>29 else
>30 for (i = 1; i < argc; i++)
>31 errs += process(argv[i]);
>32
>33 return (errs != 0);
>34 }
…продолжение далее в главе.
Переменная >myname
(строка 14) используется далее для сообщений об ошибках; >main()
первым делом устанавливает в ней имя программы (>argv[0]
). Затем >main()
в цикле перечисляет аргументы. Для каждого аргумента она вызывает функцию >process()
.
Когда в качестве имени файла дано >-
(простая черточка, или знак минус),