我想知道当我在函数中使用给定的O_NONBLOCK
时,file_des
标志会发生什么。是否保留设置标志?
如果没有,我应该在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?
}
答案 0 :(得分:2)
文件描述符是整个流程的。在函数或线程中使用时,它们始终以相同的方式工作。这种方式由状态标志控制。在Linux中,有five status flags:
O_APPEND
:导致所有写入都发生在文件末尾,忽略文件位置。
O_ASYNC
:可以读取或写入时生成信号;仅适用于终端,伪终端,插座,管道和FIFO。 (我似乎记得它也适用于某些角色设备,但我没有验证哪些,如果有的话;手册页没有说。)
O_DIRECT
:跳过I / O页面缓存。复杂,有许多限制;除非在非常有限的特殊情况下,否则不要使用。
O_NOATIME
:不要更新上次访问时间。
O_NONBLOCK
:非阻塞I / O.当数据不能立即可用或无法立即发送时,不要等待(阻塞),而是返回一个短计数。如果无法发送或接收任何内容,则read()
/ write()
等会随errno == EWOULDBLOCK
返回-1。
O_NONBLOCK
对普通文件或阻止设备没有影响。
您可以通过使用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)
后必须设置。{/ p>