当前位置: 技术问答>linux和unix
进程只有TASK_RUNNING状态才能重新被调度么?
来源: 互联网 发布时间:2017-04-21
本文导语: /*globalfifo读函数*/ static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) { int ret; struct globalfifo_dev *dev = filp->private_data; DECLARE_WAITQUEUE(wait, current); down(&dev->sem); /* 获得信号量 */ add_wa...
/*globalfifo读函数*/
static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count,
loff_t *ppos)
{
int ret;
struct globalfifo_dev *dev = filp->private_data;
DECLARE_WAITQUEUE(wait, current);
down(&dev->sem); /* 获得信号量 */
add_wait_queue(&dev->r_wait, &wait); /* 进入读等待队列头 */
/* 等待FIFO非空 */
if (dev->current_len == 0) {
if (filp->f_flags &O_NONBLOCK) {
ret = - EAGAIN;
goto out;
}
__set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态为睡眠 */
up(&dev->sem);
schedule(); /* 调度其他进程执行 */
上面的代码通过调用schedule函数使当前进程进入休眠,其他进程里面通过wake_up函数可以唤醒,wake_up为什么能唤醒它呢?不是说进程只有TASK_RUNNING状态才能重新被调度么?这个进程前面通过__set_current_state(TASK_INTERRUPTIBLE)将本进程设置成了TASK_INTERRUPTIBLE,应该调度不了啊?
static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count,
loff_t *ppos)
{
int ret;
struct globalfifo_dev *dev = filp->private_data;
DECLARE_WAITQUEUE(wait, current);
down(&dev->sem); /* 获得信号量 */
add_wait_queue(&dev->r_wait, &wait); /* 进入读等待队列头 */
/* 等待FIFO非空 */
if (dev->current_len == 0) {
if (filp->f_flags &O_NONBLOCK) {
ret = - EAGAIN;
goto out;
}
__set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态为睡眠 */
up(&dev->sem);
schedule(); /* 调度其他进程执行 */
上面的代码通过调用schedule函数使当前进程进入休眠,其他进程里面通过wake_up函数可以唤醒,wake_up为什么能唤醒它呢?不是说进程只有TASK_RUNNING状态才能重新被调度么?这个进程前面通过__set_current_state(TASK_INTERRUPTIBLE)将本进程设置成了TASK_INTERRUPTIBLE,应该调度不了啊?
|
算了,你还是就暂时这样记住吧,现在贴上来你可能也不理解。