1. 头文件和函数格式
#include<fcntl.h>
int fcntl(intfd, int cmd,.../*int arg */);
返回:如果成功则取决于cmd;如果出错,则返回-1
fcntl(与file control的名字相符),可执行各种描述符控制操作
2. 重要的操作
每个描述字都有一组由F_GETFL命令获取或者由F_SETFL命令设置的文件标志。影响套接口的两个标志是:
O_NONBLOCK 非阻塞I/O
O_ASYNC 信号驱动I/O
2.1开启非阻塞式I/O
一种错误的设置非阻塞I/O的方法:
if(fcntl(fd,F_SETFL, O_NONBLOCK)<0)
err_sys("F_SETFL error");
这段代码在设置非阻塞标志的同时也清除了所有其他文件状态标志。
设置某个文件状态标志的正确方法是:先取得当前标志,与新标志逻辑或后再设置标志。
int setnonblocking( int fd ) //fd为socket
{
int old_option = fcntl( fd, F_GETFL );//取得当前标志
int new_option = old_option | O_NONBLOCK; //与新标志逻辑或
fcntl( fd, F_SETFL, new_option ); //设置标志
return old_option;
}
2.2 关闭非阻塞标志
flags &=~O_NONBLOCK;
if(fcntl(fd,F_SETFL, flags)<0)
err_sys("F_SETFL error");