Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Системный вызов write

Write - выполняет запись в файловый дескриптор.

#include <unistd.h>

ssize_t write(

int fd, /* дескриптор */

const void *buf, /* адрес буфера с записываемыми данными*/

size_t nbytes /* количество данных для записи */

);

/* Возвращает количество записанных байт или -1 в случае ошибки (код ошибки в переменной errno) */

Системный вызов write записывает nbytes байт из буфера buf в открытый файл, который представлен дескриптором fd. Запись начинается с текущей позиции в файле, а по ее окончании текущая позиция смещается на число записанных байт. В вызывающую программу возвращается число байт, которое было записано или -1, если возникла ошибка. Если файл был открыт с флагом O_APPEND, то непосредственно перед записью текущая позиция автоматически будет перемещаться в конец файла. Вызов write может также использоваться для записи в каналы, в специальные файлы или сокеты, но в этих случаях он имеет некоторые особенности.

2.8. Системный вызов read

Read - выполняет чтение из файлового дескриптора.

#include <unistd.h>

ssize_t read(

int fd, /* дескриптор */

void *buf, /* адрес буфера для принимаемых данных*/

size_t nbytes /* объем принимаемых данных */

);

/* Возвращает количество прочитанных байт или -1 в случае ошибки (код ошибки в переменной errno) */

Системный вызов read считывает nbytes байт из файла, представленного дескриптором fd, и размещает их в буфере buf. Чтение начинается с текущей позиции в файле по окончании, и текущая позиция смещается на количество прочитанных байт. В вызывающую программу возвращается число прочитанных байт, 0 или -1, как признак ошибки.

Как и в случае write, чтение из канала, из специального файла или из сокета может быть заблокировано и, следовательно, прервано каким-либо сигналом. В результате вызывающему процессу возвращается число -1 и код ошибки EINTR в переменной errno.

2.9. Системный вызов close

Close - закрывает дескриптор файла.

#include <unistd.h>

int close(

int fd /* дескриптор файла */

);

/* Возвращает 0 в случае успеха или -1 в случае ошибки (код ошибки в переменной errno) */

Данный системный вызов не выталкивает на диск содержимое буферов ядра – он просто освобождает дескриптор файла для повторного использования. Когда закрывается последний дескриптор, ссылающийся на запись в таблице файлов, эта запись также может быть удалена. В свою очередь, когда удаляется последняя запись в таблице файлов, ссылающаяся на копию индексного узла в памяти, она также может быть удалена. Если счетчик ссылок данного индексного узла оказался равным 0, то с диска удаляется индексный узел и все связанные с ним данные. Фактически, закрывать дескрипторы файлов совсем не обязательно, поскольку они будут автоматически утилизированы по завершении процесса. Однако все структуры ядра лучше освобождать своевременно, а в текст программы добавлять комментарий, который будет сообщать об окончании работы с файлом. Это поможет во время отладки и предотвратит использование дескриптора файла по ошибке.