C 文件描述符标志和函数
我想知道当我在函数中使用给定的C 文件描述符标志和函数,c,posix,flags,file-descriptor,C,Posix,Flags,File Descriptor,我想知道当我在函数中使用给定的文件des时,O_NONBLOCK标志会发生什么。它是否保留set标志 如果没有,我是否应该在功能中重置它?还有别的办法吗 main() { int file_des; fcntl(file_des, F_SETFD, O_NONBLOCK); function(file_des); } function(int file_des) { //do something with file_des //What happen
文件des
时,O_NONBLOCK
标志会发生什么。它是否保留set标志
如果没有,我是否应该在功能中重置它?还有别的办法吗
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中,有:
O_APPEND
:导致所有写入发生在文件末尾,忽略文件位置
O_ASYNC
:可以读取或写入时生成信号;仅适用于端子、伪端子、插座、管道和FIFO。(我确实记得它也适用于某些字符设备,但我还没有验证哪些字符设备(如果有的话);手册页没有说明。)
O_DIRECT
:跳过页面缓存进行I/O。复杂,有很多限制;除非在非常有限的特殊情况下,否则不要使用
O_NOATIME
:不更新上次访问时间
O_NONBLOCK
:非阻塞I/O。当数据不立即可用或无法立即发送时,返回短计数,而不是等待(阻塞)。如果无法发送或接收任何内容,read()
/write()
等。使用errno==ewoodblock
返回-1。
O_NONBLOCK
对正常文件或块设备没有影响
您可以通过使用、与零个或多个标志一起设置新的状态标志集来修改这些设置。(要禁用全部,请使用零。)
fcntl(fd,F_SETFD,dflags)
设置文件描述符标志集。目前,只有一个这样的标志,O_CLOEXEC
,当execve()
或其他exec函数系列成功(包括popen()
和所有其他分叉并执行新进程的函数)时,该标志会导致描述符自动关闭<但是,code>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)
进行设置)文件描述符是进程范围的。在函数或线程中使用时,它们总是以相同的方式工作。这种方式由状态标志控制。在Linux中,有:
:导致所有写入发生在文件末尾,忽略文件位置O_APPEND
:可以读取或写入时生成信号;仅适用于端子、伪端子、插座、管道和FIFO。(我确实记得它也适用于某些字符设备,但我还没有验证哪些字符设备(如果有的话);手册页没有说明。)O_ASYNC
:跳过页面缓存进行I/O。复杂,有很多限制;除非在非常有限的特殊情况下,否则不要使用O_DIRECT
:不更新上次访问时间O_NOATIME
:非阻塞I/O。当数据不立即可用或无法立即发送时,返回短计数,而不是等待(阻塞)。如果无法发送或接收任何内容,O_NONBLOCK
/read()
等。使用write()
返回-1。errno==ewoodblock
对正常文件或块设备没有影响O_NONBLOCK
fcntl(fd,F_SETFD,dflags)
设置文件描述符标志集。目前,只有一个这样的标志,O_CLOEXEC
,当execve()
或其他exec函数系列成功(包括popen()
和所有其他分叉并执行新进程的函数)时,该标志会导致描述符自动关闭<但是,code>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)
)进行设置)该标志是为文件描述符设置的-无论您在何处使用它,请注意fcntl(file_des,F_SETFD,O_NONBLOCK)
将文件描述符标志设置为仅O_非块
,清除所有其他标志。标志保持设置,直到您使用另一个fcntl()
更改它们为止O_非块
应使用F_SETFL
设置,而不是F_SETFD
为文件描述符设置标志-无论您在何处使用它,请注意fcntl(file_des,F_SETFD,O_NONBLOCK)
将文件描述符标志设置为仅O_NONBLOCK
,删除任何其他标志。标志保持设置,直到您使用另一个fcntl()
O_NONBLOCK
将其设置为F_SETFL
,而不是F_SETFD