Создать и открыть файл (на низком уровне)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat( const char *path,
mode_t mode );
int creat64( const char *path,
mode_t mode );
- path
- Путь к файлу, который нужно открыть.
- mode
- Права доступа, которые необходимо использовать. Для дополнительной информации смотрите struct stat.
libc
Функции creat() и creat64() создают и открывают файл, определяемый path, в режиме mode.
Вызов creat() представляет собой:
open( path, O_WRONLY | O_CREAT | O_TRUNC, mode );
Аналогично, вызов creat64() представляет собой:
open64( path, O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, mode );
Если path существует и доступен для записи, файл усекается, чтобы не содержать данных, а существующая опция mode не изменяется.
Если path не существует, файл создается с правами доступа, указанными в аргументе mode. Права доступа для файла или директории определяются комбинацией битов, опеределенных в <sys/stat.h>
.
Файловый дескриптор. Если возникла ошибка, функция возвращает -1
, код ошибки записывается в errno.
- EACCES
- Одна из следующих проблем с правами:
- Для части path отсутствует право поиска.
- Файл, определяемый path, существует, а права, определяемые mode, не разрешены.
- Файл, определяемый path, не существует, а для родительской директории отсутствует право на запись для создания файла.
- EBADFSYS
- Во время попытки открыть path сам файл или часть его пути были повреждены. Системный сбой, который невозможно исправить автоматически, возник во время обновления директории или записи файла. Файловая система должна быть восстановлена перед продолжением операции.
- EBUSY
- Файл, определяемый path, является блочным специальным устройством, которое уже открыто для записи, либо path определяет файл в файловой системе, смонтированной на блочное специальное устройство, которое уже открыто для записи.
- EINTR
- Вызов creat() был прерван сигналом.
- EISDIR
- Файл, определяемый path, является директорией, и флаги создания файла определяют право только на запись или чтение/запись.
- ELOOP
- Слишком большой уровень символических ссылок.
- EMFILE
- Процесс использует слишком много файловых дескрипторов.
- ENAMETOOLONG
- Длина path превышает
PATH_MAX
, либо часть пути превышает NAME_MAX
. - ENFILE
- В системе открыто слишком много файлов в данный момент.
- ENOENT
- Либо префикс пути не существует, либо аргумент path указывает на пустую строку.
- ENOSPC
- Директория или файловая система, которая будет содержать новый файл, не имеет достаточно места для создания нового файла.
- ENOSYS
- Функция creat() не реализована для файловой системы, содержащей path.
- ENOTDIR
- Часть префикса пути не является директорией.
- EROFS
- Файл, определяемый path, расположен в файловой системе, доступной только для чтения.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main( void )
{
int filedes;
filedes = creat( "file", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
if ( filedes != -1 )
{
close( filedes );
return (EXIT_SUCCESS);
}
return (EXIT_FAILURE);
}
creat() — POSIX 1003.1; creat64() — Поддержка больших файлов
- Да
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Да
- В потоке
- Да
chsize(), close(), dup(), dup2(), eof(), errno, execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), fcntl(), fileno(), fstat(), isatty(), lseek(), open(), read(), sopen(), stat(), tell(), write(), umask()
Предыдущий раздел: Описание API системной библиотеки