(十一)fcntl函数的介绍和使用
来源:互联网 发布:云南大学滇池学院网络 编辑:程序博客网 时间:2024/06/04 18:22
上一篇博客我们以read终端设备为例介绍了非阻塞I/O,为什么我们不直接对STDIN_FILENO做非阻塞read,而要重新open一遍/dev/tty呢?因为STDIN_FILENO在程序启动时已经被自动打开了,而我们需要在调用open时指定O_NONBLOCK标志。这里介绍另外一种办法,可以用fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File Status Flag),而不必重新open文件。
#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct flock *lock);
这个函数和open一样,也是用可变参数实现的,可变参数的类型和个数取决于前面的cmd参数。下面的例子使用F_GETFL和F_SETFL这两种fcntl命令改变STDIN_FILENO的属性,加上O_NONBLOCK选项,实现前一博客 “非阻塞读终端”同样的功能。
#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <string.h>#include <stdlib.h>#define MSG_TRY "try again\n"int main(void){ char buf[10]; int n; int flags; flags = fcntl(STDIN_FILENO, F_GETFL);//获取标准输入的标志位 flags |= O_NONBLOCK;//增加非阻塞状态标志 if (fcntl(STDIN_FILENO, F_SETFL, flags) == -1)//写回标准输入标志位 { perror("fcntl"); exit(1); }tryagain: n = read(STDIN_FILENO, buf, 10); if (n < 0) { if (errno == EAGAIN) { sleep(1); write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY)); goto tryagain; } perror("read stdin"); exit(1); } write(STDOUT_FILENO, buf, n); return 0;}
6 0
- (十一)fcntl函数的介绍和使用
- fcntl函数的使用
- fcntl函数的使用
- fcntl函数的使用
- fcntl函数的使用详解
- fcntl函数使用(收藏)
- 关于linux 下fcntl()函数的介绍
- 【转】fcntl 函数介绍
- fcntl函数介绍
- fcntl和select函数使用详解
- 文件锁fcntl()函数的使用
- 文件锁fcntl()函数的使用
- 文件锁fcntl()函数的使用
- fcntl.h函数库的常用函数使用
- fcntl的使用(转)
- Open函数的flag和fcntl详解
- 实现dup2函数(不使用fcntl)
- fcntl 函数使用例子
- UI基础
- threejs第五篇【一条龙测试之三 threejs加载 obj 格式模型】
- Android 线程池框架、Executor、ThreadPoolExecutor详解
- turbostat man page
- Java 8新特性了解
- (十一)fcntl函数的介绍和使用
- 【软件测试】《软件测试技术基础》知识点整理
- Android移植带有libx264实现的ffmpeg
- mysql的检索数据SELECT
- log4net使用时遇到的问题记录
- Emacs键盘练习方法
- JDBC简介
- git基于一个分支创建一个新分支
- 程序对拍