文档章节

文件IO操作原理(04)——fcntl函数

乌合之众
 乌合之众
发布于 2014/11/18 14:27
字数 474
阅读 54
收藏 0

5、fcntl函数

可以用fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File Status Flag),而不必重新open文件。

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

fcntl是一个可变参数函数

fd:文件描述符(操作对象)

cmd:执行的操作标志

fcntl() 执行操作一个已经打开了的文件的文件描述符fd.这个操作来自 cmd 参数。

fcntl() 可以有一个可选的第三参数. 无论有没有这个参数,都必须有cmd参数.

File status flags 文件状态标识

F_DUPFD (long) 复制一个现有的文件描述符

F_GETFD (void) 获取一个文件的文件描述符标记

F_SETFD (long) 设置一个文件的文件描述符标记

F_GETFL (void) 获取文件状态标志

F_SETFL (long) 设置文件状态标志

 

fcntl函数修改标准输入流文件状态

   1: #include <unistd.h>
   2: #include <fcntl.h>
   3: #include <errno.h>
   4: #include <string.h>
   5: #include <stdlib.h>
   6: #include <stdio.h>
   7: 
   8: #define MSG_TRY "try again\n"
   9: #define MSG_TIMEOUT "time out\n"
  10: 
  11: int main()
  12: {
  13:     char buf[1024]={0};
  14:     //获取标准输入流文件的状态标识(读取属性)
  15:     int flags=fcntl(STDIN_FILENO,F_GETFL);
  16:     //加上非阻塞标识
  17:     flags |=O_NONBLOCK;
  18:     //设置标准输入流文件的状态标志(更新)
  19:     if(-1==fcntl(STDIN_FILENO,F_SETFL,flags)){
  20:         perror("fcntl ");   //设置失败
  21:         exit(-1);
  22:     }
  23:     int len=0;
  24:     int t=10;
  25:     while(--t){
  26:         //非阻塞模式,不会等待
  27:         len=read(STDIN_FILENO,buf,1024);
  28:         if(len<0){
  29:             if(errno==EAGAIN){
  30:                 sleep(1);
  31:                 write(STDOUT_FILENO,MSG_TRY,strlen(MSG_TRY));
  32:                 continue;   //读取失败,再次尝试
  33:             }
  34:         }
  35:         break;  //读取成功或超时,跳出
  36:     }
  37:     if(t){  //输出读取到内容到标准输出流文件
  38:         write(STDOUT_FILENO,buf,strlen(buf));
  39:     }else{
  40:         printf(MSG_TIMEOUT);    //读取超时
  41:     }
  42: 
  43:     return 0;
  44: }

© 著作权归作者所有

乌合之众
粉丝 14
博文 90
码字总数 79438
作品 1
海淀
程序员
私信 提问
周公51CTO博客有价值文章整理

说明:为方便朋友们查看本博客的文章,特地整理了本博客中周公认为值得一看的文章,不过有些文章因为年代久远且技术更新快的原因,里面所讲述的方法或者理论不再适合,请大家斟酌。 asp.net ...

周金桥
2018/06/29
0
0
来客电商

来客电商 项目介绍 非常惭愧地说,最开始是完全模仿着拼多多的功能模块来做这套系统,也仅仅是为了磨合团队,提高业务水平而已。 可谁知道,做完了拼团基本功能,还发现有评价没有做,好吧,...

沐零
2018/09/10
0
0
C++ 跨平台多功能扩展库 - cpgf

cpgf 可为C++代码增加反射(元数据)、序列化、以及Luau和Python脚本绑定等功能,且不依赖任何外部工具。 cpgf 的目标是扩展C++语言,其中包含许多易于使用的功能,这些功能仅在其他更高级别...

wqking
2018/09/17
0
0
ECSHOP_jquery兼容方案

ecshop把AJAX事件和JSON解析的模块放在common/transport.js之中,可以说它也有自己封装的一套工具,这其实是很正常的。 但恰恰的,在封装JSON各种方法的同时对object的模型进行了重写,这个就...

喵王不瞌睡
2014/07/09
0
0
网络爬虫04: Requests库详解

Requests库介绍 1.什么是Requests库 Requests使用Python语言编写的,基于urllib,采用Apache2 Licensed开源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求...

代码打碟手
2018/09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

抽象同步队列AQS——AbstractQueuedSynchronizer锁详解

AQS——锁的底层支持 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资...

须臾之余
今天
3
0
springboot配置百度UEditor 富文本详解

富文本简介 UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码... 准备工作 ueditor需要单独文...

wotrd
昨天
4
0
mysql 5.7之my.cnf配置大全

[client]port = 3306socket = /tmp/mysql.sock[mysqld]###############################基础设置######################################Mysql服务的唯一编号 每个mysql服务...

Online_Reus
昨天
3
0
MAVEN打包时引入外部链接的包

1.项目引入了ORACLE的jar包,MAVEN配置如下 2.打jar包的时候需要指定下main入口函数mainClass <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> ......

Cobbage
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部