非阻塞型I/O和阻塞型I/O

x33g5p2x  于2022-05-16 转载在 其他  
字(1.0k)|赞(0)|评价(0)|浏览(387)

非阻塞型I/O和阻塞型I/O:

非阻塞型I/O

阻塞型I/O
如果资源不可用,进程阻塞

关于它的代码补充分析:

wait_queue_head_t rwqh;
wait_queue_head_t wwqh;

增加了r读和w写的等待队列头

代码

init_waitqueue_head(&vsdev.rwqh);
init_waitqueue_head(&vsdev.wwqh);

初始化这二个队列头

if (kfifo_is_empty(&vsfifo)) {
		if (filp->f_flags & O_NONBLOCK)
			return -EAGAIN;

		if (wait_event_interruptible(vsdev.rwqh, !kfifo_is_empty(&vsfifo)))
			return -ERESTARTSYS;
	}

在FIFO为空的情况下 进行休眠,直到不为空或者接到信号才被唤醒,如果是被信号唤醒,则返回 -ERESTARTSYS。

if (!kfifo_is_full(&vsfifo))
		wake_up_interruptible(&vsdev.wwqh);

	return ret == 0 ? copied : ret;
}

在fifo不为满的情况下,唤醒所有等待的w写进程。

下面也是仿照着上面,不过是写进程

if (kfifo_is_full(&vsfifo)) {
		if (filp->f_flags & O_NONBLOCK)
			return -EAGAIN;

		if (wait_event_interruptible(vsdev.wwqh, !kfifo_is_full(&vsfifo)))
			return -ERESTARTSYS;
	}

	ret = kfifo_from_user(&vsfifo, buf, count, &copied);

	if (!kfifo_is_empty(&vsfifo))
		wake_up_interruptible(&vsdev.rwqh);

	return ret == 0 ? copied : ret;
}

测试如下:

总的还是构造并初始化等待队列头,构造等待队列节点,设置进程的状态,将节点加入等待队列,放弃CPU,调度其他进程执行,在资源可用时候,唤醒队列上的进程。

相关文章