int fcntl(int fd, int cmd, int arg)
fcntl在网络编程领域提供了以下特性:
其中fd为要设置的网络方的套接字,cmd指定操作,arg提供参数
cmd的常用标志为:
F_SETFL: 设置文件套接字状态
F_GETFL:获取套接字状态
F_SETOWN:设置套接字属主(套接字所属的进程或进程组),使用socket创建的套接字没有属组。如果一个新的套接字是从另一个监听套接字创建而来,那么套机字属主和监听套接字一致
常用套接字状态为:
O_NONBLOCK: 非阻塞套接字IO,
O_ASYNC:信号驱动式IO
使用fcntl开启非阻塞式I/O的典型代码为:
int flags;
if( (flags =fcntl(fd, F_GETFL,0) < 0)
{
err_sys("F_GETFL error");
}
flags |= O_NONBLOCK;
if( (flags =fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
{
err_sys("F_SETFL error");
}
一般要先获取状态位,再对状态位进行处理。直接用fcntl设置状态会清空掉原来的状态