LV020-非阻塞IO
来详细了解一下非阻塞IO?若笔记中有错误或者不合适的地方,欢迎批评指正😃。
一、非阻塞IO
应用程序使用非阻塞访问方式从设备读取数据,当设备不可用或数据未准备好的时候会立即向内核返回一个错误码,表示数据读取失败。应用程序会再次重新读取数据,这样一直往复循环,直到数据读取成功。

二、示例代码
应用程序可以使用如下所示示例代码来实现阻塞访问 :
c
int fd;
int data = 0;
fd = open("/dev/xxx_dev", O_RDWR); /* 阻塞方式打开 */
ret = read(fd, &data, sizeof(data)); /* 读取数据 */可以看出对于设备驱动文件的默认读取方式就是阻塞式的, 所以之前测试 APP其实都是采用阻塞 IO。如果应用程序要采用非阻塞的方式来访问驱动设备文件, 可以使用如下所示代码:
c
int fd;
int data = 0;
fd = open("/dev/xxx_dev", O_RDWR | O_NONBLOCK); /* 非阻塞方式打开 */
ret = read(fd, &data, sizeof(data)); /* 读取数据 */使用 open 函数打开“/dev/xxx_dev” 设备文件的时候添加了参数“O_NONBLOCK” , 表示以非阻塞方式打开设备, 这样从设备中读取数据的时候是非阻塞方式了。
三、非阻塞IO demo
1. demo源码
2. 开发板验证
我们执行以下命令:来验证效果:
shell
./app_demo.out /dev/sdevchr 1 0 &
./app_demo.out /dev/sdevchr 2 0 abcdefg
./app_demo.out /dev/sdevchr 2 0 sumu如下图:
