【问题标题】:open file fail(-1) with different flag settings使用不同的标志设置打开文件失败(-1)
【发布时间】:2015-03-25 18:33:42
【问题描述】:

我有一个关于在 Native android 中使用带有不同标志的 open() 的问题。

因为我想打开一个文件并忽略缓存和缓冲区,以便直接访问硬件(SD 卡)。 如果标志设置是 O_CREAT | O_RDWR | O_NDELAY, S_IRUSR | S_IWUSR| O_DIRECT | O_SYNC .我可以得到一个肯定的文件描述符(fd)。

但是如果我将设置更改为 O_CREAT | O_RDWR | S_IRUSR | S_IWUSR| O_DIRECT | O_SYNC 结果是失败(-1)。

【问题讨论】:

  • 文件已存在。我删除了 O_CREAT 并且它起作用了。但是为什么带有 O_NDELAY 的标志不会返回失败呢?
  • #include 并检查 errno 的值。如果是 EAGAIN,则意味着您需要再试一次
  • 谢谢,听从了您的建议和锯末的回答。我现在可以调试错误了。

标签: android file-io io filesystems embedded-linux


【解决方案1】:

如果标志设置为 O_CREAT | O_RDWR | O_NDELAY, S_IRUSR | S_IWUSR| O_DIRECT | O_SYNC 。我可以得到一个肯定的文件描述符(fd)。

这种形式的用法不太正确

int open(const char *pathname, int flags, mode_t mode);

但如果我将设置更改为 O_CREAT | O_RDWR | S_IRUSR | S_IWUSR| O_DIRECT | O_SYNC 结果是失败(-1)。

你所谓的“设置”标志模式符号的无效混合。此外,由于已在 flags 中指定了 O_CREAT,因此必须提供 mode 参数,而它不是。
尝试将 modeflags 分开:

open(pathname, O_CREAT | O_RDWR | O_DIRECT | O_SYNC, S_IRUSR | S_IWUSR);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多