我想知道当我在函数中使用给定的 file_des
时,O_NONBLOCK
标志会发生什么。它是否保留设置的标志?
如果不是,我应该在 function
中重置它吗?还有其他办法吗?
main()
{
int file_des;
fcntl(file_des, F_SETFD, O_NONBLOCK);
function(file_des);
}
function(int file_des)
{
//do something with file_des
//What happens with the O_NONBLOCK flag?
}
最佳答案
文件描述符是进程范围的。在函数或线程中使用时,它们总是以相同的方式工作。这种方式由状态标志控制。在 Linux 中,有 five status flags :
O_APPEND
:导致所有写入发生在文件末尾,忽略文件位置。O_ASYNC
:当可以读或写时产生一个信号;仅适用于终端、伪终端、套接字、管道和 FIFO。 (我确实记得它也可用于某些字符设备,但我没有验证哪些设备(如果有的话);手册页没有说明。)O_DIRECT
:跳过 I/O 的页面缓存。复杂,有很多限制;除非在非常有限的特殊情况下,否则不要使用。O_NOATIME
:不更新上次访问时间。O_NONBLOCK
:非阻塞 I/O。当数据不能立即可用或不能立即发送时,不要等待(阻塞),而是返回一个短计数。如果无法发送或接收任何内容,read()
/write()
等将返回 -1 以及errno == EWOULDBLOCK
。O_NONBLOCK
对普通文件或 block 设备没有影响。
您可以通过使用 fcntl(fd, F_SETFL, flags)
设置一组新的状态标志来修改它们, 零个或多个标志或在一起。 (要禁用所有,请使用零。)
fcntl(fd, F_SETFD, dflags)
设置了一组文件描述符标志。目前,只有一个这样的标志,O_CLOEXEC
,当 execve()
或其他 exec 系列函数成功时(包括 popen()
和所有其他派生并执行新进程的)。不过,O_CLOEXEC
通常用作 open()
调用的标志,以避免与另一个执行 fork()
的线程竞争窗口介于两者之间。
当您使用 open(filename, flags)
或 open(filename, flags, mode)
时,flags
参数是以下组合访问模式(O_RDONLY
、O_WRONLY
或 O_RDWR
;必须使用其中一个)、文件创建标志(包括文件描述符标志)和文件状态标志,或在一起。 (O_ASYNC
除外,它不能在open()
时指定,必须在之后使用fcntl(fd, F_SETFL, flags | O_ASYNC)
.)
关于c - 文件描述符标志和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50475058/