如何在unix中创建阻塞文件描述符?

时间:2012-11-21 16:41:39

标签: c file unix blocking

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

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

是吗?我不能添加一些模式选项,比如0666吗?

非阻塞文件怎么样?我根本不知道。

我想实现类似的目标:

  1. 当我打开它来写入它,并且它已经打开写入时,它没关系;如果没有阻止。
  2. 当我打开它阅读它,它打开阅读时,没关系;如果没有阻止。

3 个答案:

答案 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没有标准的方法来锁定独占访问的文件,除此之外。有咨询锁(但所有程序必须遵守协议)。有些人有强制锁定扩展。收到的智慧是在访问网络文件系统时不依赖于任何一种锁定。