Skip to content
On this page

fcntl(2)


标签:linux/api  

文件描述符属性

文件描述符的属性其实是 int 类型的数值,从源代码文件 linux/fcntl.h 可以发现其实是 0 开头的八进制数字,通过按位或的操作合并属性比如 O_CREAT|O_TRUNC

函数原型

功能:设置/获取文件描述符属性

c
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

参数:

  • int fd:指定要设置/获取属性的文件描述符;
  • int cmd
    • F_GETFL (void)获取文件描述符属性,第三个参数不用填;获取到的属性从返回值返回
    • F_SETFL (int)设置文件描述符,第三个参数是一个 int 类型的数据

给文件描述符设置非阻塞

  1. 获取文件描述符原有的属性 flag
  2. 在原有的属性基础上加上非阻塞属性 flag |= O_NONBLOCK
  3. 将修改后的 flag 重新设置回文件描述符中

当一个文件描述符是非阻塞的时候,需要一个循环不停判断该文件的文件描述符是否有数据可都,成为 polling。此时应用程序会不停的 polling 内核检测 IO 事件是否产生,CPU 消耗高。IO 中导致函数阻塞的原因是因为文件描述符有阻塞属性。

Last updated: