我想在Unix的C中创建阻塞和非阻塞文件描述符。一、堵:
fd = open("file.txt", O_CREAT | O_WRONLY | O_EXCL);
是这样吗?我是不是应该添加一些模式选项,比如0666?非阻塞文件怎么样?我不知道该怎么办。我想实现这样的目标:1.当我打开它在里面写的时候,它是打开写的,它是可以的;如果不是,则阻塞。1.当我打开它来阅读时,它是打开来阅读的,这是可以的;如果不是,则阻塞。
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函数:
open()
read()
int open(const char *filename, int options, ...);
qhhrdooz2#
我不知道你怎么称呼阻塞文件(在Unix中阻塞IO意味着IO操作等待数据可用或确定失败,它们与非阻塞IO相反,如果没有可用数据,它会立即返回)。
eivnm1vs3#
我是不是应该增加一些模式选项?如果文件是只写的,并且如果文件不存在,则创建它。在这种情况下,open()也需要第三个参数,因此省略它会导致未定义的行为。
编辑:
更新的问题更让人困惑……当我打开它写的时候,它是打开写的,它是可以的;如果不是,则阻塞。你为什么需要那个如果你试图写入一个没有打开的文件/文件描述符,write()将返回-1,你可以检查存储在errno中的错误代码。告诉我们你想通过这个奇怪的东西来实现什么,而不是让代码变得过于复杂和混乱。(括号内的备注:我想创建阻塞和非阻塞文件那是什么?在unix的C再说一次,根本没有这种事。有**C语言,它是平台无关的。
write()
errno
3条答案
按热度按时间w7t8yxp51#
文件描述符是阻塞还是非阻塞;文件不是。如果您想要一个非阻塞的文件描述符,请将O_NBLOCK添加到
open()
调用中的选项中。请注意,打开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()
的第三个参数。它是一个varargs函数:qhhrdooz2#
我不知道你怎么称呼阻塞文件(在Unix中阻塞IO意味着IO操作等待数据可用或确定失败,它们与非阻塞IO相反,如果没有可用数据,它会立即返回)。
eivnm1vs3#
我是不是应该增加一些模式选项?
如果文件是只写的,并且如果文件不存在,则创建它。在这种情况下,
open()
也需要第三个参数,因此省略它会导致未定义的行为。编辑:
更新的问题更让人困惑……
当我打开它写的时候,它是打开写的,它是可以的;如果不是,则阻塞。
你为什么需要那个如果你试图写入一个没有打开的文件/文件描述符,
write()
将返回-1,你可以检查存储在errno
中的错误代码。告诉我们你想通过这个奇怪的东西来实现什么,而不是让代码变得过于复杂和混乱。(括号内的备注:
我想创建阻塞和非阻塞文件
那是什么?
在unix的C
再说一次,根本没有这种事。有**C语言,它是平台无关的。