【问题标题】:error when writing to file after opening it with O_APPEND | O_CREATE使用 O_APPEND 打开文件后写入文件时出错 | O_CREATE
【发布时间】:2014-01-16 07:31:31
【问题描述】:

我在 O_APPEND | 中打开了一个名为“pranav”的文本文件。 O_CREAT模式如下图:

     #include<unistd.h>
     #include<fcntl.h>
     #include<stdio.h>
     main()
     {
     //FILE Descriptor fdes
     /*Open file pranav.txt in write-only mode,
      O_CREAT creates file if it does not exist*/
      int fdes = open("pranav.txt",O_APPEND | O_CREAT );
      //Error returns -1
      if(fdes!=-1)
      {
           //To write on file
             if((write(fdes,"Pranav",6))== -1)
             write(2,"File_Writing_Error",18);
             //To print on screen
             else
             write(1,"Done",4);
      }
      else
      {
            //Print "error" on screen
               write(2,"File_Opening_Error",18);
      }
      close(fdes);
       }

在 O_APPEND 模式下,它执行 write(2,"File_Writing_Error",18);语句,因此无法在文件上写入“Pranav”,但如果我使用 O_WRONLY 模式,则不会发生此错误并且程序成功运行

【问题讨论】:

  • 使用perror (linux.die.net/man/3/perror) 打印真正的错误信息
  • 使用perror()函数知道错误
  • 感谢您增加了我的知识。它打印了错误:“Bad File Descriptor”

标签: c operating-system


【解决方案1】:

open 的文档说,您必须准确给出 O_RDONLYO_WRONLYO_RDWR 标志之一,并且您可以使用其他标志的任意组合,例如 O_APPENDO_CREAT

除了O_APPENDO_CREAT,您没有提供O_WRONLY。我的猜测是 O_RDONLY 是 0,所以当不提供访问标志之一时,您最终会得到 O_RDONLY,因此无法写入文件。

所以正确的代码应该是:

mode_t mode = S_IRWXU | SIRWXG;  // or any other mode
int fdes = open("pranav.txt", O_APPEND | O_CREAT | O_WRONLY, mode);

如果标志包含O_CREATO_TMPFILE,请注意附加参数mode

【讨论】:

  • 非常感谢。以前以为 O_APPEND 是 O_WRONLY 的替代品,现在我知道它是和 O_WRONLY 一起使用的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2013-11-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多