文件描述符标志和功能

时间:2018-05-22 19:21:32

标签: c posix flags file-descriptor

我想知道当我在函数中使用给定的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?
}

1 个答案:

答案 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_RDONLYO_WRONLYO_RDWR的组合;必须使用一个),文件创建标志(包括文件描述符标志)和文件状态标志,或者一起使用。 (O_ASYNC除外,open()时无法指定,fcntl(fd, F_SETFL, flags | O_ASYNC)后必须设置。{/ p>