Appearance
文件描述符属性
文件描述符的属性其实是 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类型的数据
给文件描述符设置非阻塞
- 获取文件描述符原有的属性
flag - 在原有的属性基础上加上非阻塞属性
flag |= O_NONBLOCK - 将修改后的
flag重新设置回文件描述符中
当一个文件描述符是非阻塞的时候,需要一个循环不停判断该文件的文件描述符是否有数据可都,成为 polling。此时应用程序会不停的 polling 内核检测 IO 事件是否产生,CPU 消耗高。IO 中导致函数阻塞的原因是因为文件描述符有阻塞属性。