select与stdio混合使用的不良后果

参考以下链接自己补充实验:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.aspx?opt=admin

  1. int main(int argc,char *argv[]){
  2. fd_set rfd;
  3. char buf[3]={0};
  4. FD_ZERO(&rfd);
  5. while(1){
  6. FD_SET(fileno(stdin),&rfd);
  7. select(1,&rfd,0,0,0);
  8. printf("standard input your data come in\n");
  9. fgets(buf,3,stdin);
  10. printf("buf=%s\n",buf);
  11. }
  12. }

用stdin跟fgets在用户跟内核都有缓冲



 当从键盘输入123456789+回车,开始保存到stdin用户缓冲.但看到回车(\n)就刷入到内核缓冲区,select发现stdin在内核缓冲区有数据.于是不阻塞.接着调用fgets,fgets发现用户缓冲区没数据.于是从内核读取一行(123456789\n),放到用户缓冲区.接着读取2个(1,2)..用户缓冲区还剩下3456789\n.但内核已经空了.select发现内核缓冲区空了.那就会阻塞.

------前方高能.当继续输入1+回车的时候,因为之前fgets用户缓冲区有剩余数据(3456789\n).输入1+回车.将使得内核有1\n数据,select不阻塞.于是fgets看到用户缓冲区有数据就直接读取.并不从内核缓冲区读取.于是把3456789\nqu

来自为知笔记(Wiz)

时间: 2024-10-21 07:47:55

select与stdio混合使用的不良后果的相关文章

select函数与stdio混用的不良后果 (转)

出自:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.html 今天在看UNP6.5节,学习到了select与stdio混用的后果.特此进程实验一番.再实验之前需明确一下几点:1.stdio流的i/o函数 与 系统i/o函数不同.stdio流函数在用户空间和内核都有缓冲,系统i/o函数只在内核有缓冲,用户空间没有. 2.stdio流的i/o函数缓冲机制:在面对文件时候用的是全缓冲,面对设备的时候用的行缓冲.(等下试验用的是键盘和

ITFriend创业败局(五):创业可以停止,公司必须注销,不然后果很严重

马上又要继续出来创业做事了,想到要注册公司,有个麻烦事. 事情得回到2014年9月. 当时,由于各种因素,决定放弃ITFriend,当然也放弃了原来了公司.先是,咨询了横德瑞的陈总,关于公司注销的事.他是这么说的:公司注销,需要花费5000元左右,6个月左右的时间.也说道,如果不注销,3年内不能再当法人.     当时,我是这么想的:花这么多钱,还要这么长时间(我比较担心,需要留在北京6个月) ,还有3年内不能当法人(计划老老实实工作一段时间的),于是乎,就一走了之了. 回到现在,和武汉一个朋友

阿里Java面试题剖析:项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?

面试原题 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚,那确实比较尴尬. 只要问到缓存,上来第一个问题,肯定是先问问你项目哪里用了缓存?为啥要用?不用行不行?如果用了以后可能会有什么不良的后果? 这就是看看你对缓存这个东西背后有没有思考,如果你就是傻乎乎的瞎用,没法给面试官一个合理的解答,那面试官对你印象肯定不太好,觉得你平时思考太少,就知道干活儿. 面试题剖析 项目中缓存是如何使用的? 这个,需要结合

TCP/IP 网络编程 (三)

服务器端未处理高并发请求通常采用如下方式: 多进程:通过创建多个进程提供服务 多路复用:通过捆绑并统一管理 I/O 对象提供服务 多线程:通过生成和客户端等量的线程提供服务 多进程服务器端 #include <unistd.h> pid_t fork(); // 成功返回进程 ID, 失败返回-1 fork函数将创建调用的函数副本.子进程将使用新的内存空间复制当前函数的环境. 父进程:函数返回子进程ID 子进程:函数返回 0 可以理解为调用该函数之后将存在两个pid_t,分别存在父子进程中,因

《网络编程》带外数据

带外数据 有些传输层协议具有带外(Out Of Band,OOB)数据的概念,用于迅速通告对端本端所发生的重要事件.因此,带外数据比普通数据(也称为带内数据)有更高的优先级,它应该总是立即被发送,而不论发送缓冲区中是否有排队等待发送的普通数据或因流量控制而导致发送端的通告窗口大小为 0(即停止发送数据) .带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中. UDP 没有实现带外数据传输,TCP 也没有真正的带外数据.只不过 TCP 利用其首部中的 紧急指针标志 和 紧

Myeclipse 无法自动编译的解决方法

整理网络资源并实践的结果. 确保 project->build automatically 已经被选上 如果选上了,也不好使, 使用这一招: project->clean..->选第2个clean select project, 勾上start build immediately 删除现在的项目,提前设置好编译文件输出路径,重新导入源文件,设置eclipse为保存时编译,然后在保存的时候就可以自动编译了 如果项目里引了某个不用的jar包,而那个包又被你删了,就会出现不报错但怎么也编译不出

Linux OOM killer 机制

Linux中的Out Of Memory(OOM) Killer功能是一种确保系统内存足够的最终手段,可以在耗尽系统内存或交换区后,按某种算法判断占用系统最多资源的进程,向进程发送信号,强制终止该进程. 简单来说该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉. 这个功能即使在无法释放内存的情况下,也能够重复进行确保内存的处理过程,防止系统停滞,还可以找出过度消耗内存的进程. 典型的情况是:某天一台机器突然ssh远程登录不了,但能ping通,说

北大SQL数据库视频课程笔记

Jim Gray - Transaction processing: concepts and techniqueshttp://research.microsoft.com/~gray/ 事务概念 事务定义- 事务是由一系列操作序列构成的程序执行单元,这些操作要么都做,要么都不做,是一个不可分割的工作单位. 事务特性(ACID)* 原子性(Atomicity)事务中包含的所有操作要么全做,要么全不做,原子性由恢复机制实现. * 一致性(Consistency)事务的隔离执行必须保证数据库的一致

Unity3d 经验小结

Unity3d 经验小结 文本教程 你是第2541个围观者 0条评论 供稿者:Jamesgary 标签:unity3d教程 Fbx.贴图导入Unity时的注意事项: 在导出Fbx之前,Maya中已经对物体连接了正确的贴图,并且贴图文件名不能更改. 把Fbx和贴图放在同一文件夹内,直接把此文件加拖入Unity内.此时Diffuse贴图应能自动识别. 此时,对贴图修改后,在Unity中更新贴图(删除老贴图,导入新贴图,并保持命名,路经一致),模型能够自动更新. 假如Unity中删除贴图,关闭Unit