c - 文件描述符标志和函数

标签 c posix flags file-descriptor

我想知道当我在函数中使用给定的 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_RDONLYO_WRONLYO_RDWR;必须使用其中一个)、文件创建标志(包括文件描述符标志)和文件状态标志,或在一起。 (O_ASYNC除外,它不能在open()时指定,必须在之后使用fcntl(fd, F_SETFL, flags | O_ASYNC).)

关于c - 文件描述符标志和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50475058/

相关文章:

c++ - 为什么共享库符号中定义的符号没有被使用?

c - 添加文件关闭语句导致段错误

linux - 使用 Linux 头文件中的 unistd.h 构建不带 libc 的静态 ELF

java - 如何保存java优化标志?

c - 如何制作makefile?

c - 使用 stat (st_uid) 的段错误(核心转储)

signals - SIGIO 不是 POSIX,SIGPOLL 被标记为 "Obsolescent"。我用什么?

linux - 如何为GNU find适本地限定-or运算符?如何找到指向可执行文件的符号链接(symbolic link)?

java - 如何在自定义 Android View 中检查重力标志?

c - PKCS11,对象 PIN