Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОперационныеСистемы, общие понятия.docx
Скачиваний:
140
Добавлен:
08.02.2015
Размер:
366.4 Кб
Скачать

Системныевызовыработысфайламиopen,creat,close,dup,dup2.(21-2, 19-2)

Операции ввода/вывода в ОС Unix связанны с вводом/выводом в файл. Файлы стандартного ввода/вывода и протокола ошибок автоматически открываются для любого вновь порожденного процесса и получают пользовательские дескрипторы файла 0,1,2 соответственно.

Эти дескрипторы ассоциируются с одним и тем же специальным файлов /dev/tty, соответствующему терминалу данного пользователя.

  1. /dev/tty – ввод с клавиатуры.

  2. /dev/tty – вывод на экран.

  3. /dev/tty – сообщения об ошибках.

Системный вызов open

Для работы с файлами – их открытия и создания, используется системный вызов open:

#include <fcntl.h> //для констант видов доступа

int open(char* filename, int flag);

int open(char* filename, int flag, mode_t mode);

Возвращаемое значение – наименьший свободный пользовательский дескриптор файла (целое, неотрицательное число).

*filename – указатель на строку символов, содержащую полное имя открываемого файла.

flag – целые значения, указывающие, какие виды доступа к файлу разрешены:

  1. Открыть для чтения (O_RDONLY).

  2. Открыть для записи (O_WDONLY).

  3. Открыть и для чтения, и для записи (O_RDWR).

mode – код защиты создаваемого файла.

Системный вызов creat

Системный вызов create служит для создания обыкновенных файлов и одновременного открытия их на запись:

int creat(char* filename, mode_t mode);

Если файл, имя которого определяется в name, существовал ранее, то его содержимое будет потеряно.

Аналог:open( filename,O_CREAT|mode);

Системные вызовы dup, dup2

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

int new_fd = dup(int old_fd);

int new_fd = dup2(int old_fd, int new_fd);

old_fd – пользовательский дескриптор копируемого файла.

new_fd – копия дескриптора:

В случае dup – порядковый номер первой свободной записи в таблице пользовательских дескрипторов.

В случае dup2 – переданный new_fd. Если такой дескриптор уже открыт данным процессом, dup2 закроет этот файл.

Системные вызовы ввода/вывода. (20-2, 8-2)

(Здесь достаточно read и write)

Самый низкий уровень ввода/вывода в ОС Unix не предусматривает ни какой-либо буферизации, ни какого-либо сервиса, а является обращением непосредственно к ОС.

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

Системный вызов read выбирает блок данных фиксированного размера из файла с указанным пользовательским дескриптором fd:

ssize_t read(int fd, char* buf, int n);

buf – буфер в программе пользователя, куда должны поступать данные.

n – число, запрошенных для ввода, байт.

Системный вызов read возвращает ssize_t – количество байтов, успешно прочитанных и сохраненных в аргументе buf. Как правило оно равно n. Если файл содержит меньше n байтов, то значение ssize_t будет меньше n. Если встречается признак конца файла, то значение ssize_t = 0.

Системный вызов write

Системный вызов write помещает блок данных фиксированного размера в файл с пользовательским дескриптором fd.

buf – буфер в программе пользователя, откуда берутся данные.

n – число байт, которые необходимо записать.

Если диск файловой системы переполнился или размер файла превышает критическое значение, вернется -1.