0

我想在 Unix 的 C 中创建阻塞和非阻塞文件。首先,阻塞:

fd = open("file.txt", O_CREAT | O_WRONLY | O_EXCL);

那正确吗?我不应该添加一些模式选项,例如 0666 吗?

非阻塞文件怎么样?我对此一无所知。

我想实现类似:

  1. 当我打开它写在里面,它打开写,就可以了;如果不是,它会阻塞。
  2. 当我打开它阅读时,它打开阅读,没关系;如果不是,它会阻塞。
4

3 回答 3

2

文件描述符是阻塞的还是非阻塞的;文件不是。open()如果需要非阻塞文件描述符,请将 O_NBLOCK 添加到调用中的选项。

请注意,打开 FIFO 进行读取或写入将阻塞,除非有一个进程为其他操作打开了 FIFO,或者您指定了 O_NBLOCK。如果您打开它进行读写,则它open()是非阻塞的(将立即返回);I/O 操作仍然由是否设置 O_NBLOCK 来控制。

更新的问题不清楚。但是,如果您正在寻找“对文件的独占访问权限”(以便其他人没有打开它),那么 O_EXCL 和 O_NBLOCK 都不是答案。O_EXCL 影响创建文件时发生的情况;如果文件已存在,则创建将失败。O_NBLOCK 影响read()当没有数据可供读取时操作是否会阻塞。如果您阅读 POSIXopen()描述,那里没有任何内容允许您请求对文件的“独占访问”。

要回答有关文件模式的问题:如果包含 O_CREAT,则需要open(). 如果省略 O_CREAT,则不需要open(). 它是一个可变参数函数:

int open(const char *filename, int options, ...);
于 2012-11-21T18:05:23.253 回答
1

我不应该添加一些模式选项吗?

如果文件是只写的并且如果不存在,则应该创建。在这种情况下,open()也需要第三个参数,因此省略它会导致未定义的行为。

编辑:

更新的问题更加令人困惑......

当我打开它写在里面,它打开写,就可以了;如果不是,它会阻塞。

你为什么需要那个?看,如果您尝试写入未打开用于写入的文件/文件描述符,write()将返回 -1,您可以检查存储在errno. 告诉我们你想要通过这个奇怪的事情来实现什么,而不是过度复杂化和弄乱你的代码。

(括号内备注:

我想创建阻塞和非阻塞文件

那是什么?

在 unix 的 C 中

再一次,没有这样的事情。有C 语言,它与平台无关。

于 2012-11-21T16:47:25.930 回答
1

我不知道你在调用什么阻塞文件(在 Unix 中阻塞 IO 意味着 IO 操作等待数据可用或确定失败,它们反对非阻塞 IO,如果没有则立即返回可用数据)。

  • 使用 O_CREAT 打开时,您始终需要指定模式。

  • 如果文件已经存在(针对上述问题进行了修复),您显示的打开将失败。

  • Unix 没有标准方法来锁定文件以进行独占访问,但除外。有咨询锁(但所有程序都必须遵守协议)。有些有强制锁扩展。公认的智慧是在访问网络文件系统时不要依赖任何一种锁定。

于 2012-11-21T16:47:50.063 回答