非阻塞型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,调度其他进程执行,在资源可用时候,唤醒队列上的进程。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_35629971/article/details/124745499
内容来源于网络,如有侵权,请联系作者删除!