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

• ENFILE — достигнуто ограничение на количество открытых файлов, накладываемое на всю систему.

• ENOENT — заданный файл не существует, и ключ O_CREAT не указан; или O_CREAT был указан, и один из каталогов в путевом имени не существует или является символьной ссылкой, ведущей на несуществующее путевое имя (битой ссылкой).

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

• ETXTBSY — заданный файл является исполняемым (программой), и в данный момент выполняется. Изменение исполняемого файла, связанного с выполняемой программой (то есть его открытие для записи), запрещено. (Чтобы изменить исполняемый файл, сначала следует завершить программы.)

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

4.3.3. Системный вызов creat()

В ранних реализациях UNIX у open() было только два аргумента, и этот вызов нельзя было использовать для создания нового файла. Вместо него для создания и открытия нового файла использовался системный вызов creat().

#include

int creat(const char *pathname, mode_t mode);

Возвращает дескриптор файла или –1 при ошибке

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

fd = open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

Поскольку аргумент flags системного вызова open() предоставляет больше контроля над тем, как открывается файл (например, вместо O_WRONLY можно указать O_RDWR), системный вызов creat() теперь считается устаревшим, хотя в старых программах он еще встречается.

4.4. Чтение из файла: read()

Системный вызов read() позволяет считывать данные из открытого файла, на который ссылается дескриптор fd.

#include

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

Возвращает количество считанных байтов, 0 при EOF или –1 при ошибке

Аргумент count определяет максимальное количество считываемых байтов (тип данных size_t — беззнаковый целочисленный). Аргумент buffer предоставляет адрес буфера памяти, в который должны быть помещены входные данные. Этот буфер должен иметь длину в байтах не менее той, что задана в аргументе count.

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

При успешном вызове read() возвращается количество фактически считанных байтов или 0, если встретился символ конца файла. При ошибке обычно возвращается –1. Тип данных ssize_t относится к целочисленному типу со знаком. Этот тип используется для хранения количества байтов или значения –1, которое служит признаком ошибки.

При вызове read() количество считанных байтов может быть меньше запрашиваемого. Возможная причина для обычных файлов — близость считываемой области к концу файла.

При использовании вызова read() в отношении других типов файлов, например конвейеров, FIFO-устройств, сокетов или терминалов, также могут складываться различные обстоятельства, при которых количество считанных байтов оказывается меньше запрашиваемого. Например, изначально применение read() в отношении терминала приводит к считыванию символов только до следующего встреченного символа новой строки (\n). Эти случаи будут рассматриваться при изучении других типов файлов далее в книге.

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

#define MAX_READ 20

char buffer[MAX_READ];

if (read(STDIN_FILENO, buffer, MAX_READ) == -1)

errExit("read");

printf("The input data was: %s\n", buffer);

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

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

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

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

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

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

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

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

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