Linux программирование в примерах | страница 80



, если вам нужно сделать что-либо, не определенное стандартом С ISO. Функция >fileno() возвращает лежащий в основе дескриптор файла:

>#include /* POSIX */


>int fileno(FILE *stream);

Пример мы увидим позже, в разделе 4.4.4. «Пример: Unix cat».

4.4.2.2. Закрытие всех открытых файлов

Открытые файлы наследуются порожденными процессами от своих родительских процессов. Фактически они являются общими. В частности, общим является положение в файле. Подробности мы оставим для дальнейшего обсуждения в разделе 9.1.1.2 «Разделение дескрипторов файлов».

Поскольку программы могут наследовать другие файлы, иногда вы можете увидеть программы, которые закрывают все свои файлы, чтобы начать с «чистого состояния» В частности, типичен код наподобие этого:

>int i;

>/* оставить лишь 0, 1, и 2 */

>for (i = 3; i < getdtablesize(); i++)

> (void)close(i);

Предположим, что результат >getdtablesize() равен 1024. Этот код работает, но он делает (1024-3)*2 = 2042 системных вызова. >1020 из них не нужны, поскольку возвращаемое значение >getdtablesize() не изменяется. Вот лучший вариант этого кода:

>int i, fds;

>for (i = 3, fds = getdtablesize(); i < fds; i++)

> (void)close(i);

Такая оптимизация не ухудшает читаемость кода, но может быть заметна разница, особенно на медленных системах. В общем, стоит поискать случаи, когда в циклах повторно вычисляется один и тот же результат, чтобы посмотреть, нельзя ли вынести вычисление за пределы цикла. Хотя в таких случаях нужно убедиться, что вы (а) сохраняете правильность кода и (б) сохраняете его читаемость!

4.4.3. Чтение и запись

Ввод/вывод осуществляется системными вызовами >read() и >write() соответственно:

>#include /* POSIX */

>#include

>#include

>#include


>ssize_t read(int fd, void *buf, size_t count);

>ssize_t write(int fd, const void *buf, size_t count);

Каждая функция сделана как можно проще. Аргументами являются дескриптор открытого файла, указатель на буфер для чтения или записи данных и число читаемых или записываемых байтов.

Возвращаемое значение является числом действительно прочитанных или записанных байтов. (Это число может быть меньше запрошенного: при операции чтения это происходит, когда в файле осталось меньше >count байтов, а при операции записи это случается, когда диск заполнен или произошла еще какая-нибудь ошибка.) Возвращаемое значение -1 означает возникшую ошибку, в этом случае errno указывает эту ошибку. Когда