我想在Unix的C中创建阻塞和非阻塞文件。首先,阻塞:
fd = open("file.txt", O_CREAT | O_WRONLY | O_EXCL);
是吗?我不能添加一些模式选项,比如0666吗?
非阻塞文件怎么样?我根本不知道。
我想实现类似的目标:
答案 0 :(得分:2)
文件描述符是阻塞的或非阻塞的;文件不是。如果需要非阻塞文件描述符,请将O_NBLOCK添加到open()
调用中的选项。
请注意,打开FIFO进行读取或写入将被阻止,除非有进程为其他操作打开FIFO,或者指定O_NBLOCK。如果你打开它进行读写,open()
是非阻塞的(将立即返回); I / O操作仍由您是否设置O_NBLOCK控制。
更新后的问题尚不清楚。但是,如果您正在寻找“对文件的独占访问权限”(以便其他人没有打开它),那么O_EXCL和O_NBLOCK都不是答案。 O_EXCL会影响创建文件时发生的情况;如果文件已存在,则create将失败。 O_NBLOCK会影响当没有可读数据时read()
操作是否会阻塞。如果您阅读了POSIX open()
说明,则没有任何内容允许您请求对文件进行“独占访问”。
要回答有关文件模式的问题:如果包含O_CREAT,则需要第open()
个参数。如果省略O_CREAT,则不需要open()
的第三个参数。这是一个varargs功能:
int open(const char *filename, int options, ...);
答案 1 :(得分:1)
我不应该添加一些模式选项吗?
如果文件是只写的,则应该创建,如果不存在则创建。在这种情况下,open()
也需要第三个参数,因此省略它会导致未定义的行为。
修改强>
更新的问题更令人困惑......
当我打开它来写入它,它打开写入时,它没关系;如果没有阻止。
你为什么需要那个?请参阅,如果您尝试写入未打开以进行写入的文件/文件描述符,write()
将返回-1,您可以检查errno
中存储的错误代码。告诉我们你想要通过这个奇怪的事情来实现什么,而不是过度复杂和搞乱你的代码。
(括号中的备注:
我想创建阻止和非阻塞文件
那是什么?
在unix的C
中
同样,没有这样的事情。有 C语言,它与平台无关。)
答案 2 :(得分:1)
我不知道你在调用阻塞文件是什么(在Unix中阻止IO意味着IO操作等待数据可用或确定失败,他们反对非阻塞IO,如果非阻塞IO立即返回没有可用的数据。)
使用O_CREAT打开时,您始终需要指定一种模式。
如果文件已经存在,则显示的打开将失败(在上述点修复后)。
Unix没有标准的方法来锁定独占访问的文件,除此之外。有咨询锁(但所有程序必须遵守协议)。有些人有强制锁定扩展。收到的智慧是在访问网络文件系统时不依赖于任何一种锁定。