这段时间做一个项目需要将套接字设置成为非阻塞模式进行通信,了解了一下这个函数,很有用。
fcntl函数:改变已打开文件的性质;也就是操作文件描述符。
-
#include <fcntl.h>
-
#include <unistd.h>
-
-
int fcntl(int filedes,int cmd, ... /*int arg*/);
-
返回值:成功依赖cmd的值,失败返回-1;
四个命令有特有的返回值:
F_DUPFD:返回一个新的文件描述符;
F_GETFD、F_GETFL:返回相应的标志;
F_GETOWN: 返回一个正的或者负的进程组ID;
fcntl函数有5种功能:
1. 复制一个现有的描述符(cmd=F_DUPFD);
2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD);
3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL);
4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN);
5. 获得/设置记录锁(cmd=F_GETLK , F_SETLK或F_SETLKW);
F_DUPFD:复制文件描述符filedes。新文件描述符作为函数的返回。类似于pud,pud2;
F_GETFD:对应于filedes的文件描述符标志作为函数的值返回。当前只定义了一个文件描述符标志FD_CLOEXEC。
F_SETFD:对于filedes设置文件描述符标志。新标志值按第三个参数(取为整型值)设置。
F_GETFL:对应于文件状态标志作为函数值返回。
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 为读、写打开
O_APPEND 每次写时追加
O_NONBLOCK 非阻塞模式
O_SYNC 等待写完成(数据和属性)
O_DSYNC 等待写完成(数据)
O_RSYNC 同步读、写
O_FSYNC 等待写完成(进FreeBSD和Mac OS X)
O_ASYNC 异步I/O(进FreeBSD和Mac OS X)
F_SETFL:将文件状态标志设置成为第三个参数的值(取整形值)。
F_GETOWN:取当前接受SIGIO和SIGURG信号的进程ID和进程组ID.正的arg指定一个进程ID,负的arg表示等于arg绝对值的一个进程中ID。
使用方法:
-
#include <unistd.h>
-
#include <fcntl.h>
-
int flag;
-
//获取文件状态标志
-
if((flag = fcntl(sockfd,F_GETFL,0) == -1)
-
{
-
flag = 0;
-
}
-
//设置文件状态标志将打开的套接字为非阻塞模式
-
fcntl(sockfd,F_SETFL,flag | O_NONBLOCK);
阅读(4032) | 评论(0) | 转发(0) |