进程只有TASK_RUNNING状态才能重新被调度么
/*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,应该调度不了啊?
把本进程设置成TASK_INTERRUPTIBLE,就是不希望本进程被调度,等待wake_up, 在wake_up前都不会被调度。因为wake_up前等待的条件都不会成熟,所以不需要进程再次被调度了。所以要改变状态。wake_up的时候状态会改成running的,别担心