Для начала работы с файлом его необходимо открыть. Для этого существует специальный системный вызов open:
#include <sys/types.h>
#include <sys/stat.h>
#include <fentl.h>
int open(const char *name, int flags);
int open(const char *name, int flags, mode_l mode);
Данный системный вызов использует первый параметр name как полный путь к файлу и сопоставляет с этим именем дескриптор файла, который возвращается при успешном завершении операции. Позиция в файле устанавливается в 0, а разрешение на доступ к файлу определяется вторым параметром flags. Он может принимать следующие значения:
O_RDONLY – только для чтения
O_WRONLY – только для записи
O_RDWR – и чтение, и запись
Пример использования системного вызова с проверкой:
int fd;
fd=open(“/home/stud/file1”,O_RDONLY);
if (fd==-1)
{ //обработка ошибки }
Над файлом можно выполнять только разрешенные параметром flags действия. Процесс, который выполняет открытие, должен иметь соответственные права доступа.
Также есть и дополнительные флаги, которые могут присоединяться операцией ИЛИ с основными:
O_APPEND – файл открыт в режиме присоединения, перед каждой записью указатель позиции устанавливается в конец файла;
O_CREAT – если файл name не существует, то он создается, если же файл существует и помимо CREAT используется EXCL, то open завершается с ошибкой (возвращается -1);
O_EXCL – этот флаг совместно с CREAT используется для предотвращения повторного создания файла;
O_SYNC – файл открывается для синхронного ввода/вывода, при этом ни одна операция записи не будет завершена, пока данные физически не будут записаны на диск;
O_NONBLOCK – файл открывается в режиме без блокировки, если это возможно. Т.е. ни вызов open, ни любые другие вызовы не приводят к блокировке (засыпанию) процесса во время ввода-вывода. Флаг определен только для конвейеров FIFO;
O_TRUNC – при использовании этого флага, если файл существует и это обычный файл, он усекается до нулевой длины, запись в него допускается.
Примером использования системного вызова open с некоторыми из выше перечисленных флагов:
fd=open(“/home/stud/file.rot”, O_WRONLY|O_TRUNC);
Владельцем нового файла становится владелец EUID процесса, создавшего файл.