Skip to content

LV020-非阻塞IO

来详细了解一下非阻塞IO?若笔记中有错误或者不合适的地方,欢迎批评指正😃。

一、非阻塞IO

应用程序使用非阻塞访问方式从设备读取数据,当设备不可用或数据未准备好的时候会立即向内核返回一个错误码,表示数据读取失败。应用程序会再次重新读取数据,这样一直往复循环,直到数据读取成功。

image-20250122191256550

二、示例代码

应用程序可以使用如下所示示例代码来实现阻塞访问 :

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源码

08_IO_model/03_io_noblock

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

如下图:

image-20250124181651911