2010-04-03 72 views
6

考虑下面的代码(它应该在的“HelloWorld”文件写的“HelloWorld”,然后阅读文本):空调系统调用open /读/写/关闭和O_CREAT | O_EXCL

#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 

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

Error1 
Error2 
helloworld 

我不明白为什么文本没有添加,因为我已经指定了O_APPEND文件。 是因为我包含了O_CREAT吗? 它的文件已经创建好了,是不是应该忽略O_CREAT?

回答

11

O_EXCL强制文件被创建。如果文件已经存在,则呼叫失败。

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

  • O_CREAT:如果文件尚不存在,请使用给定权限创建文件。如果文件存在,它将被打开并且权限被忽略。
  • O_CREAT | O_EXCL:如果文件尚不存在,请使用给定的权限创建文件。如果该文件存在,则失败。这对创建锁文件和保证对文件的独占访问很有用(只要使用该文件的所有程序遵循相同的协议)。
  • O_CREAT | O_TRUNC:如果文件尚不存在,请使用给定的权限创建该文件。否则,截断文件为零字节。当我们认为“创建一个新的空白文件”时,这会产生更多的效果。不过,它仍然保留已存在于现有文件中的权限。从the manual page

的更多信息:

O_EXCL

当O_CREAT使用时,如果该文件 已经存在,这是一个错误, 的open()将失败。在这种情况下, 存在一个符号链接,无论它指向何处 。 NFS文件系统上的O_EXCL被破坏 ; 依靠它来执行锁定的程序 任务将包含竞争条件。 用于使用锁文件来创建 同一文件 系统上的唯一的文件(例如,包含主机名 和PID),使用链路(2),以使一个链接 到锁文件执行原子 文件锁定该溶液。如果link()返回0, ,则锁定成功。否则,在唯一文件上使用 stat(2)来检查其链接计数是否增加到2,在 这种情况下锁定也是 成功。

+0

谢谢,通过删除O_EXCL代码是功能。你能解释我使用O_EXCL吗? – 2010-04-03 20:03:41