read( ) 函数 —— 终端输入设备的阻塞与非阻塞的设置
来源:互联网 发布:网上买旧书知乎 编辑:程序博客网 时间:2024/06/05 02:47
read( ) 函数 —— 终端输入设备的阻塞与非阻塞的设置
如果没有数据,那么该调用将被阻塞.处于等待状态,直到有字符输入,
或者到了规定的时限和出现错误为止,
通过以下方法,能使read函数立即返回。
fcntl(fd,F_SETFL,FNDELAY);
FNDELAY 函数使read函数在端口没月字符存在的情况下,立刻返回0,
如果要恢复正常(阻塞)状态,可以调用fcntl()函数,不要FNDELAY参数,
如下所示:
fcntl(Fd,F_SETFL,0);
在使用O_NDELAY参数打开串行口后,同样与使用了该函数调用。
fcntl(fd,F_SETFL,0);
----------------------------
http://blog.csdn.net/mituan2008/article/details/6711830
read(stdin, buf, size);
printf(“hello”);
如果read是阻塞的则会停止到read语句不会执行下一个语句;否则不会停止,会执行下一个语句。
- #include <stdio.h>
- #include <stdlib.h>
- #define COUNT 10
- int
- main()
- {
- char buf[COUNT];
- size_t nbytes;
- int n;
- for (n = 0; n< COUNT; n++)
- buf[n] = 0;
- nbytes = 10;
- read(stdin, buf, nbytes);
- printf("hello\n");
- printf("%s\n", buf);
- }
这个标准输入,我想应该是会阻塞的,结果是没有阻塞:
没有停止等待输入就直接输出了。这是有问题的,stdin是指针类型而read要求用int型的参数。
最后,改成:
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #define COUNT 10
- int
- main()
- {
- char buf[COUNT];
- size_t nbytes;
- int n, flags;
- for (n = 0; n< COUNT; n++)
- buf[n] = 0;
- if ( (flags = fcntl(STDIN_FILENO, F_GETFL, 0)) < 0)
- {
- printf("F_GETFL error");
- exit(0);
- }
- printf("flags:%d\n", flags);
- nbytes = 10;
- read(STDIN_FILENO, buf, nbytes);
- printf("hello\n");
- printf("%s\n", buf);
- }
结果:
设置nonblock选项后:
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #define COUNT 10
- int
- main()
- {
- char buf[COUNT];
- size_t nbytes;
- int n, flags;
- int fd;
- fd = 0;
- for (n = 0; n< COUNT; n++)
- buf[n] = 0;
- if ( (flags = fcntl(STDIN_FILENO, F_GETFL, 0)) < 0)
- {
- printf("F_GETFL error");
- exit(0);
- }
- printf("flags old:%d\n", flags);
- flags |= O_NONBLOCK;
- if (fcntl(STDIN_FILENO, F_SETFL, flags) < 0)
- {
- printf("F_SETFL error");
- exit(0);
- }
- printf("flags new:%d\n", flags);
- nbytes = 10;
- read(STDIN_FILENO, buf, nbytes);
- printf("hello\n");
- printf("%s\n", buf);
- }
结果:
结果就像我想的那样。read阻塞的话会停止不进行,而非阻塞的话将不等待从stdin读取数据这个动作。
2 0
- read( ) 函数 —— 终端输入设备的阻塞与非阻塞的设置
- 终端非阻塞输入的设置
- 设备的阻塞与非阻塞操作
- read和getchar的阻塞和非阻塞输入
- read函数的阻塞和非阻塞的区别
- 深入浅出LDD-5-设备的阻塞与非阻塞操作
- UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- IO模式设置,阻塞与非阻塞IO的比较
- IO模式设置,阻塞与非阻塞的比较
- fcntl函数对非阻塞的设置
- PHP的flock函数 阻塞与非阻塞
- 封装非阻塞模式下的read,write函数
- 阻塞与非阻塞设置
- linux串口编程--规范模式和非规范模式及read的阻塞与非阻塞
- read函数阻塞和非阻塞
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较
- read/write函数与(非)阻塞I/O的概念
- 阻塞与非阻塞的区别
- Plugin execution not covered by lifecycle configuration...
- 自定义TextView之 给你的TextView添加边框
- 弱校学渣,直播ACM之路
- tomcat配置多个web的配置详解
- .sortEntities()is called this array is sorted by the entities.zIndex.
- read( ) 函数 —— 终端输入设备的阻塞与非阻塞的设置
- 第十二周 计算图G中出度为0的顶点数
- knockoutjs二 observableArray的使用
- JAVA7环境下Spring容器对locale对象反序列的bug
- ToolKit的配置
- Listener 监听器
- Python Network Programming(8)---SocketServer模块
- 关于今天笔记本电脑突然CPU占用比突然飙到90%以上的问题
- 大屏幕自适应