C语言 如何在Unix中创建阻塞文件描述符?

vjrehmav  于 2023-05-16  发布在  Unix
关注(0)|答案(3)|浏览(130)

我想在Unix的C中创建阻塞和非阻塞文件描述符。一、堵:

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

是这样吗?我是不是应该添加一些模式选项,比如0666?
非阻塞文件怎么样?我不知道该怎么办。
我想实现这样的目标:
1.当我打开它在里面写的时候,它是打开写的,它是可以的;如果不是,则阻塞。
1.当我打开它来阅读时,它是打开来阅读的,这是可以的;如果不是,则阻塞。

w7t8yxp5

w7t8yxp51#

文件描述符是阻塞还是非阻塞;文件不是。如果您想要一个非阻塞的文件描述符,请将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()的第三个参数。它是一个varargs函数:

int open(const char *filename, int options, ...);
qhhrdooz

qhhrdooz2#

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

  • 使用O_CREAT打开时,始终需要指定模式。
  • 如果文件已经存在(当针对上述点进行修复时),则显示的打开将失败。
  • Unix没有标准的方法来锁定文件的独占访问除外。有建议锁(但所有程序都必须遵守协议)。有些有强制性的锁扩展。在访问网络文件系统时,公认的智慧是不依赖任何一种锁定。
eivnm1vs

eivnm1vs3#

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

编辑:

更新的问题更让人困惑……
当我打开它写的时候,它是打开写的,它是可以的;如果不是,则阻塞。
你为什么需要那个如果你试图写入一个没有打开的文件/文件描述符,write()将返回-1,你可以检查存储在errno中的错误代码。告诉我们你想通过这个奇怪的东西来实现什么,而不是让代码变得过于复杂和混乱。
(括号内的备注:
我想创建阻塞和非阻塞文件
那是什么?
在unix的C
再说一次,根本没有这种事。有**C语言,它是平台无关的。

相关问题