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
    :导致所有写入发生在文件末尾,忽略文件位置

  • 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)
)进行设置)

该标志是为文件描述符设置的-无论您在何处使用它,请注意
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