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, в в каком случае замок также успешный.