sopen()

Открыть файл для общего доступа

Прототип:

#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <share.h>
int sopen( const char *filename,
int oflag,
int share,
... );

Аргументы:

filename
Имя открываемого файла.
oflag
Комбинация флагов, определяющих статус и режим открытия файла (битовые константы определены в <fcntl.h>):
O_RDONLY
открытие только для чтения.
O_WRONLY
открытие только для записи.
O_RDWR
открытие для чтения и записи.
O_APPEND
открытие для дополнения.
O_CREAT
создать файл, если он не существует (игнорируется, если файл уже создан).
O_TRUNC
обнуление размера существующего файла (игнорируется, если файл не существует).
O_EXCL
открыть для эксклюзивного доступа; если также передан флаг O_CREAT, открытие провалится (совместное использование флагов позволяет убедиться в том, что создаваемый файл не существует).
share
Режим совместного доступа к файлу (комбинация битов, описанных в <share.h>):
SH_COMPAT
режим совместимости.
SH_DENYRW
предотвращает чтение или запись в файл.
SH_DENYWR
предотвращает запись в файл.
SH_DENYRD
предотвращает чтение файла.
SH_DENYNO
разрешает чтение и запись в файл.
mode
Данный аргумент должен быть установлен если установлен флаг O_CREAT. Объект типа mode_t, который определяет режим доступа к созданному файлу. Подробнее см. в режим доступа.

Библиотека:

libc

Описание:

Функция sopen() открывает файл для раздельного доступа. Имя открываемого файла указывается в filename.

Доступ к файлу осуществляется в соответствии с параметром oflag. Если файл не существует, следует указать флаг O_CREAT.

Режим совместного доступа определяется параметром share. Опциональный аргумент mode опредляет права доступа к созданному файлу (используется, если установлен флаг O_CREAT).

Функция sopen() применяет маску разрешений к запрашиваемому режиму доступа (см. umask()).

Обратите внимание, что

open( path, oflag, ... );

эквивалентно следующему:

sopen( path, oflag, SH_DENYNO, ... );


Note: Функция sopen() игнорирует блокировки через fcntl().

Возвращаемое значение:

Файловый дескриптор. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EACCES
Права поиска отсутствуют в одном из компонентов пути поиска; файл существует, но доступ в соответствии с oflag запрещен; файл не существует и отсутствуют права на запись в родительскую директорию.
EBUSY
Режим совместного доступа (share) запрещен из-за существования конфликтующего вызова sopen().
EEXIST
Установлены флаги O_CREAT и O_EXCL и файл уже существует.
EISDIR
Указанный файл является директорией и аргумент oflag определяет режим только для записи или чтения-записи.
ELOOP
Слишком большое число символьных ссылок или префиксов.
EMFILE
Нет доступных файловых дескрипторов (слишком много открытых файлов).
ENOENT
Путь или файл не найдены.
ENOSYS
Функция sopen() не реализована для файловой системы, ассоциированной с path.

Примеры:

#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <share.h>
int main( void )
{
int filedes;
/* open a file for output */
/* replace existing file if it exists */
filedes = sopen( "file", O_WRONLY | O_CREAT | O_TRUNC, SH_DENYWR,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
/* read a file which is assumed to exist */
filedes = sopen( "file", O_RDONLY, SH_DENYWR );
/* append to the end of an existing file */
/* write a new file if file doesn't exist */
filedes = sopen( "file", O_WRONLY | O_CREAT | O_APPEND, SH_DENYWR,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
return (EXIT_SUCCESS);
}

Классификация:

Unix

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

struct stat, chsize(), close(), creat(), dup(), dup2(), eof(), execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), fcntl(), fileno(), fstat(), isatty(), lseek(), open(), read(), stat(), tell(), umask(), write()




Предыдущий раздел: Описание API системной библиотеки