Читаем Linux API. Исчерпывающее руководство полностью

В главе 5 рассматриваемые здесь вопросы будут расширены дополнительными сведениями, касающимися файлового ввода-вывода. Еще одна особенность файлового ввода-вывода — буферизация — настолько сложна, что заслуживает отдельной главы. Буферизация ввода-вывода в ядре и с помощью средств библиотеки stdio будет описана в главе 13.

4.1. Общее представление

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

Обычно от большинства программ ожидается возможность использования трех стандартных дескрипторов файлов, перечисленных в табл. 4.1. Эти три дескриптора открыты оболочкой от имени программы еще до запуска самой программы. Точнее говоря, программа наследует у оболочки копии дескрипторов файлов, а оболочка обычно работает с этими всегда открытыми тремя дескрипторами файлов. (В интерактивной оболочке эти три дескриптора обычно ссылаются на терминал, на котором запущена оболочка.) Если в командной строке указано перенаправление ввода-вывода, то оболочка перед запуском программы обеспечивает соответствующее изменение дескрипторов файлов.

Таблица 4.1. Стандартные дескрипторы файлов

Дескриптор файла — Назначение — Имя согласно POSIX — Поток stdio

0 — Стандартный ввод — STDIN_FILENO — stdin

1 — Стандартный вывод — STDOUT_FILENO — stdout

2 — Стандартная ошибка — STDERR_FILENO — stderr

При ссылке на эти дескрипторы файлов в программе можно использовать либо номера (0, 1 или 2), либо, что предпочтительнее, стандартные имена POSIX, определенные в файле .

Хотя переменные stdin, stdout и stderr изначально ссылаются на стандартные ввод, вывод и ошибку процесса, с помощью библиотечной функции freopen() их можно изменить для ссылки на любой файл. В качестве части своей работы freopen() способен изменить дескриптор файла на основе вновь открытого потока. Иными словами, после вызова freopen() в отношении, к примеру, stdout, нельзя с полной уверенностью предполагать, что относящийся к нему дескриптор файла по-прежнему имеет значение 1.

Рассмотрим следующие четыре системных вызова, которые являются ключевыми для выполнения файлового ввода-вывода (языки программирования и программные пакеты обычно используют их исключительно опосредованно, через библиотеки ввода-вывода).

• fd = open(pathname, flags, mode) — открытие файла, идентифицированного по путевому имени — pathname, с возвращением дескриптора файла, который используется для обращения к открытому файлу в последующих вызовах. Если файл не существует, вызов open() может его создать в зависимости от установки битовой маски аргумента флагов — flags. В аргументе флагов также указывается, с какой целью открывается файл: для чтения, для записи или для проведения обеих операций. Аргумент mode (режим), определяет права доступа, которые будут накладываться на файл, если он создается этим вызовом. Если вызов open() не будет использоваться для создания файла, этот аргумент игнорируется и может быть опущен.

• numread = read(fd, buffer, count) — считывание не более указанного в count количества байтов из открытого файла, ссылка на который дана в fd, и сохранение их в буфере buffer. При вызове read() возвращается количество фактически считанных байтов. Если данные не могут быть считаны (то есть встретился конец файла), read() возвращает 0.

• numwritten = write(fd, buffer, count) — запись из буфера байтов, количество которых указано в count, в открытый файл, ссылка на который дана в fd. При вызове write() возвращается количество фактически записанных байтов, которое может быть меньше значения, указанного в count.

• status = close(fd) — вызывается после завершения ввода-вывода с целью высвобождения дескриптора файла fd и связанных с ним ресурсов ядра.

Перед тем как подробно разбирать эти системные вызовы, посмотрим на небольшую демонстрацию их использования в листинге 4.1. Эта программа является простой версией команды cp(1). Она копирует содержимое существующего файла, чье имя указано в первом аргументе командной строки, в новый файл с именем, указанным во втором аргументе командной строки.

Программой, показанной в листинге 4.1, можно воспользоваться следующим образом:

$ ./copy oldfile newfile

Листинг 4.1. Использование системных вызовов ввода-вывода

fileio/copy.c

#include

#include

#include "tlpi_hdr.h"

#ifndef BUF_SIZE /* Позволяет "cc — D" перекрыть определение */

#define BUF_SIZE 1024

#endif

int

main(int argc, char *argv[])

{

int inputFd, outputFd, openFlags;

mode_t filePerms;

ssize_t numRead;

char buf[BUF_SIZE];

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных