我想在 Unix 的 C 中创建阻塞和非阻塞文件。首先,阻塞:
fd = open("file.txt", O_CREAT | O_WRONLY | O_EXCL);
是吗?我不应该添加一些模式选项,例如 0666 吗?
非阻塞文件怎么样?我对此一无所知。
我想实现这样的目标:
- 当我打开它进行写入时,它打开进行写入,没问题;如果不是,它会阻塞。
- 当我打开它阅读时,它已经打开阅读,没问题;如果不是,它会阻塞。
最佳答案
文件描述符是阻塞的还是非阻塞的;文件不是。如果您需要非阻塞文件描述符,请将 O_NBLOCK 添加到 open()
调用中的选项。
请注意,打开 FIFO 进行读取或写入将阻塞,除非有进程打开 FIFO 进行其他操作,或者您指定了 O_NBLOCK。如果您打开它进行读写,open()
是非阻塞的(将立即返回); I/O 操作仍然由您是否设置 O_NBLOCK 控制。
更新后的问题不清楚。但是,如果您正在寻找“对文件的独占访问权”(以便其他人无法打开它),那么 O_EXCL 和 O_NBLOCK 都不是答案。 O_EXCL 影响创建文件时发生的情况;如果文件已经存在,创建将失败。 O_NBLOCK 影响 read()
操作在没有数据可供读取时是否会阻塞。如果您阅读 POSIX open()
描述,那里没有任何东西允许您请求对文件的“独占访问”。
要回答有关文件模式的问题:如果包含 O_CREAT,则需要 open()
的第三个参数。如果省略 O_CREAT,则不需要 open()
的第三个参数。这是一个可变参数函数:
int open(const char *filename, int options, ...);
关于c - 如何在 unix 中创建阻塞文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497911/