本文共 1104 字,大约阅读时间需要 3 分钟。
理解Linux进程状态切换
static ssize_t xxx_write(struct file *file, const char *buffer, size_t count, loff_t *ppos){ ... DECLARE_WAITQUEUE(wait, current); /* 定义等待队列,初始化一个名为name的等待队列 */ add_wait_queue(&xxx_wait, &wait); /* 添加等待队列,将等待队列wait添加到等待队列头xxx_wait指向的等待队列链表中 */ ret = count; /* 等待设备缓冲区可写 */ do { avail = device_writable(...); if (avail < 0) __set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态,直接采用current->state = TASK_INTERRUPTIBLE也可行,类似有__add_current_state() */ if (avail < 0) { if (file->f_flags & O_NONBLOCK) { /* 非阻塞 */ if(!ret) ret = -EAGAIN; goto out; } schedule(); /* 调度其他进程执行 */ if (signal_pending(current)) { /* 如果是因为信号唤醒 */ if(!ret) ret = -ERESTARTSYS; goto out; } } }while (avail < 0); /* 写设备缓冲区 */ device_write(...); out: remove_wait_queue(&xxx_wait, &wait); /* 将等待队列移出等待队列头 */ set_current_state(TASK_RUNNING); /* 设置进程状态为TASK_RUNNING */ return ret;}
转载地址:http://qshvb.baihongyu.com/