Язык Си



         

Глава 8. Интерфейс с системой UNIX - часть 3


#include "syscalls.h"

main() /* копирование ввода на вывод */ { char buf[BUFSIZ]; int n;

while ((n = read(0, buf, BUFSIZ)) > 0) write(i, buf, n); return 0; }

Прототипы функций, обеспечивающие системные вызовы, мы собрали в файле syscalls.h, что позволяет нам включать его в программы этой главы. Однако имя данного файла не зафиксировано стандартом.

Параметр BUFSIZ также определен в <syscalls.h>: в каждой конкретной системе он имеет свое значение. Если размер файла не кратен BUFSIZ, то какая-то операция чтения вернет значение меньшее, чем BUFSIZ, а следующее обращение к read даст в качестве результата нуль.

Полезно рассмотреть, как используются read и write при написании программ более высокого уровня — таких как getchar, putchar и т. д. Вот, к примеру, версия программы getchar, которая осуществляет небуферизованный ввод, читая по одному символу из стандартного входного потока.

#include "syscalls.h" /* getchar: небуферизованный ввод одного символа */ int getchar(void) { char с; return (read(0, &c, 1) == 1) ? (unsigned char) с : EOF; }

Переменная c должна быть типа char, поскольку read требует указателя на char. Приведение c к unsigned char перед тем, как вернуть ее в качестве результата, исключает какие-либо проблемы, связанные с распространением знака.

Вторая версия getchar осуществляет ввод большими кусками, но при каждом обращении выдает только один символ.

#include "syscalls.h"

/* getchar: простая версия с буферизацией */ int getchar(void) { static char buf[BUFSIZ]; static char *bufp = buf; static int n = 0;

if (n == 0) { /* буфер пуст */ n = read(0, buf, sizeof buf); bufp = buf; } return (--n >= 0) ? (unsigned char) *bufp++ : EOF; }

Если приведенные здесь версии функции getchar компилируются с включением заголовочного файла <stdio.h> и в этом заголовочном файле getchar определена как макрос, то нужно задать строку #undef с именем getchar.

В отличие от стандартных файлов ввода, вывода и ошибок, которые открыты по умолчанию, остальные файлы нужно открывать явно. Для этого есть два системных вызова: open и creat.




Содержание  Назад  Вперед