read( ) 函数 —— 终端输入设备的阻塞与非阻塞的设置
2015-12-30 19:50
357 查看
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语句不会执行下一个语句;否则不会停止,会执行下一个语句。
[cpp] view
plaincopy
#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
= 0;
nbytes = 10;
read(stdin, buf, nbytes);
printf("hello\n");
printf("%s\n", buf);
}
这个标准输入,我想应该是会阻塞的,结果是没有阻塞:
没有停止等待输入就直接输出了。这是有问题的,stdin是指针类型而read要求用int型的参数。
最后,改成:
[cpp] view
plaincopy
#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
= 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选项后:
[cpp] view
plaincopy
#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
= 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读取数据这个动作。
如果没有数据,那么该调用将被阻塞.处于等待状态,直到有字符输入,
或者到了规定的时限和出现错误为止,
通过以下方法,能使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语句不会执行下一个语句;否则不会停止,会执行下一个语句。
[cpp] view
plaincopy
#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
= 0;
nbytes = 10;
read(stdin, buf, nbytes);
printf("hello\n");
printf("%s\n", buf);
}
这个标准输入,我想应该是会阻塞的,结果是没有阻塞:
没有停止等待输入就直接输出了。这是有问题的,stdin是指针类型而read要求用int型的参数。
最后,改成:
[cpp] view
plaincopy
#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
= 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选项后:
[cpp] view
plaincopy
#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
= 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读取数据这个动作。
相关文章推荐
- 基于CTP的程序化交易系统开发(一)
- glib g_main_loop理解
- 边界模块-system generator
- Linux 的档案权限与目录配置
- 实验四 主存空间的分配和回收模拟
- iOS的WebView自适应内容高度
- 自定义TextView之 给你的TextView添加边框
- 关于今天笔记本电脑突然CPU占用比突然飙到90%以上的问题
- Excel Sheet Column Number 把大写字符串转换为整数
- JAVA7环境下Spring容器对locale对象反序列的bug
- ToolKit的配置
- Android 各大网络http请求库的比较及实战
- Listener 监听器
- Python Network Programming(8)---SocketServer模块
- 手记 12/30/2015
- 第十二周 计算图G中出度为0的顶点数
- knockoutjs二 observableArray的使用
- 自己使用 1.C语言历史以及特点。
- iOS UI-手势(Gesture)
- [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD