Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417018
  • 博文数量: 48
  • 博客积分: 1032
  • 博客等级: 上士
  • 技术积分: 1256
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-19 13:24
文章分类

全部博文(48)

文章存档

2014年(3)

2013年(23)

2012年(22)

分类: LINUX

2012-10-22 23:04:38

这段时间做一个项目需要将套接字设置成为非阻塞模式进行通信,了解了一下这个函数,很有用。
fcntl函数:改变已打开文件的性质;也就是操作文件描述符。

点击(此处)折叠或打开

  1. #include <fcntl.h>
  2. #include <unistd.h>

  3. int fcntl(int filedes,int cmd, ... /*int arg*/);        
  4. 返回值:成功依赖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。

使用方法:

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. int flag;
  4. //获取文件状态标志
  5. if((flag = fcntl(sockfd,F_GETFL,0) == -1)
  6. {
  7. flag = 0;
  8. }
  9. //设置文件状态标志将打开的套接字为非阻塞模式
  10. fcntl(sockfd,F_SETFL,flag | O_NONBLOCK);


阅读(4032) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~