C системные вызовы open / read / write / close и O CREAT / o EXCL
учитывая следующий код (он должен написать "helloworld" в файле "helloworld", а затем прочитать текст):
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FNAME "helloworld"
int main(){
int filedes, nbytes;
char buf[128];
/* Creates a file */
if((filedes=open(FNAME, O_CREAT | O_EXCL | O_WRONLY | O_APPEND,
S_IRUSR | S_IWUSR)) == -1){
write(2, "Error1n", 7);
}
/* Writes hello world to file */
if(write(filedes, FNAME, 10) != 10)
write(2, "Error2n", 7);
/* Close file */
close(filedes);
if((filedes = open(FNAME, O_RDONLY))==-1)
write(2, "Error3n", 7);
/* Prints file contents on screen */
if((nbytes=read(filedes, buf, 128)) == -1)
write(2, "Error4n", 7);
if(write(1, buf, nbytes) != nbytes)
write(2, "Error5n", 7);
/* Close file after read */
close(filedes);
return (0);
}
первый раз, когда я запускаю программу, вывод:
helloworld
после этого каждый раз, когда я запускаю программу, вывод:
Error1
Error2
helloworld
Я не понимаю, почему текст не добавляется, поскольку я указал файл O_APPEND. Это потому, что я включил O_CREAT? Это файл уже создан, не должен O_CREAT быть игнорируется?
1 ответов
O_EXCL
принудительно создает файл. Если файл уже существует, вызов завершается ошибкой.
Он используется для обеспечения того, что файл должен быть создан с заданными разрешениями, переданными в третьем параметре. Короче говоря, у вас есть следующие варианты:
-
O_CREAT
: создайте файл с заданными разрешениями, если файл еще не существует. Если файл существует, он открывается и разрешения игнорируются. -
O_CREAT | O_EXCL
: создайте файл с заданным разрешения, если файл еще не существует. Если файл существует, он терпит неудачу. Это полезно для создания lockfiles и гарантировать эксклюзивный доступ к файлу (если все программы, которые используют этот файл следовать тому же протоколу). -
O_CREAT | O_TRUNC
: создайте файл с заданными разрешениями, если файл еще не существует. В противном случае усечь файл до нуля байт. Это имеет больше эффекта, который мы ожидаем, когда мы думаем "создать новый пустой файл". Тем не менее, он сохраняет разрешения уже присутствует в существующем файле.
дополнительную информацию страница руководства:
указывает
при использовании O_CREAT если файл уже существует это ошибка и open () завершится ошибкой. В этом контексте, символическая ссылка существует независимо от куда он указывает. Указывает. на файловых системах NFS; программы, положитесь на него для выполнения блокировки задачи будут содержать гонку состояние. Решение для выполнения atomic блокировка файлов с помощью lockfile создать уникальный файл на том же файле система (например, включающая имя хоста и пид), связь(2) сделать ссылку в файл блокировки. Если link () возвращает 0, замок удался. В противном случае, используйте stat (2) в уникальном файле для проверки количество ссылок увеличилось до 2, в в каком случае замок также успешный.