Учитывая следующий код (это, как предполагается, пишет "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, "Error1\n", 7);
}
/* Writes hello world to file */
if(write(filedes, FNAME, 10) != 10)
write(2, "Error2\n", 7);
/* Close file */
close(filedes);
if((filedes = open(FNAME, O_RDONLY))==-1)
write(2, "Error3\n", 7);
/* Prints file contents on screen */
if((nbytes=read(filedes, buf, 128)) == -1)
write(2, "Error4\n", 7);
if(write(1, buf, nbytes) != nbytes)
write(2, "Error5\n", 7);
/* Close file after read */
close(filedes);
return (0);
}
В первый раз, когда я запускаю программу, вывод:
helloworld
После того каждого раза I для запущения программы вывод:
Error1
Error2
helloworld
Я не понимаю, почему текст не добавляется, поскольку я указал файл O_APPEND. Это, потому что я включал O_CREAT? Это файл уже создается, не был должен O_CREAT быть проигнорированным?
O_EXCL
принудительно создает файл. Если файл уже существует, вызов не выполняется.
Он используется для обеспечения того, чтобы файл был создан с указанными разрешениями, переданными в третьем параметре. Вкратце, у вас есть следующие варианты:
O_CREAT
: создать файл с заданными разрешениями, если файл еще не существует. Если файл существует, он открывается, а разрешения игнорируются. O_CREAT | O_EXCL
: создать файл с указанными разрешениями, если файл еще не существует. Если файл существует, он не работает. Это полезно для создания файлов блокировки и гарантии монопольного доступа к файлу (при условии, что все программы, использующие этот файл, следуют одному и тому же протоколу). O_CREAT | O_TRUNC
: Создайте файл с указанными разрешениями, если файл еще не существует. В противном случае обрежьте файл до нуля байтов. Это имеет больший эффект, чем мы ожидаем, когда думаем «создать новый пустой файл». Тем не менее, он сохраняет разрешения, уже присутствующие в существующем файле. Дополнительная информация на странице руководства :
O_EXCL
При использовании с O_CREAT, если файл уже существует, это ошибка и открытое () не удастся. В этом контексте символическая ссылка существует независимо от того, на что она указывает. O_EXCL не работает в файловых системах NFS; программы, которые полагаются на него для выполнения задач блокировки , будут содержать условие гонки. Решение для выполнения атомарной блокировки файла с использованием файла блокировки состоит в том, чтобы {{1 }} создайте уникальный файл в той же файловой системе (например, включив имя хоста и pid), используйте ссылку (2), чтобы создать ссылку на файл блокировки.Если link () возвращает 0, блокировка успешна. В противном случае используйте stat (2) для уникального файла, чтобы проверить, увеличилось ли его количество ссылок до 2, в в этом случае блокировка также успешна. .