Linux 驱动开发基础---阻塞与非阻塞
作者:
也许
,
2022-05-15 17:51:27
,
所有人可见
,
阅读 196
read函数阻塞与非阻塞
读常规文件是不会阻塞的, 从字符设备或网络读则不一定
注意:对于普通文件、块设备文件,O_NONBLOCK不起作用。
注意:对于字符设备文件,O_NONBLOCK起作用的前提是驱动程序针对O_NONBLOCK做了处理。
应用编程可以设置非阻塞read字符设备
1. open函数传入参数: flag |= O_NONBLOCK
int fd = open(“/dev/xxx”, O_RDWR | O_NONBLOCK); /* 非阻塞方式 */
int fd = open(“/dev/xxx”, O_RDWR ); /* 阻塞方式 */
2. fcntl()函数修改
int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | O_NONBLOCK); /* 非阻塞方式 */
fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); /* 阻塞方式 */
驱动程序针对O_NONBLOCK的处理
驱动程序要根据这个标记位决定事件未就绪时是休眠和还是立刻返回。
static ssize_t drv_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos)
if (queue_empty(&as->queue) && fp->f_flags & O_NONBLOCK)
return -EAGAIN;
wait_event_interruptible(apm_waitqueue, !queue_empty(&as->queue));
……
}