fcntl()函数


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");


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值