C系统调用open / read / write / close和O_CREAT | O_EXCL

前端之家收集整理的这篇文章主要介绍了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,"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,nbytes) != nbytes)
        write(2,"Error5\n",7);

    /* Close file after read */
    close(filedes); 

    return (0);
}

我第一次运行程序时,输出是:

helloworld

之后每次运行程序时,输出为:

Error1
Error2
helloworld

我不明白为什么没有附加文本,因为我已经指定了O_APPEND文件.
是因为我加入了O_CREAT吗?
它已经创建了文件,不应忽略O_CREAT吗?

解决方法

O_EXCL强制创建文件.如果文件已存在,则调用失败.

它用于确保必须创建文件,并在第三个参数中传递给定的权限.简而言之,您有以下选择:

> O_CREAT:如果文件尚不存在,则使用给定的权限创建文件.如果该文件存在,则会打开该文件并忽略权限.
> O_CREAT | O_EXCL:如果文件尚不存在,则创建具有给定权限的文件.如果文件存在,则失败.这对于创建锁定文件并保证对文件的独占访问非常有用(只要使用该文件的所有程序都遵循相同的协议).
> O_CREAT | O_TRUNC:如果文件尚不存在,则创建具有给定权限的文件.否则,将文件截断为零字节.当我们想到“创建一个新的空白文件”时,这会产生更多的效果.但是,它保留了现有文件中已存在的权限.

来自the manual page的更多信息:

@H_404_30@O_EXCL

When used with O_CREAT,if the file already exists it is an error and the open() will fail. In this context,a symbolic link exists,regardless of where it points to. O_EXCL is broken on NFS file systems; programs which rely on it for performing locking tasks will contain a race condition. The solution for performing atomic file locking using a lockfile is to create a unique file on the same file system (e.g.,incorporating hostname and pid),use link(2) to make a link to the lockfile. If link() returns 0,the lock is successful. Otherwise,use stat(2) on the unique file to check if its link count has increased to 2,in which case the lock is also successful.

猜你在找的C&C++相关文章