linux驱动之阻塞机制

设计驱动阻塞机制,通过等待队列wait_queue来实现

1.schedules之后,等待信号,函数就退出了,原因是什么?********
答:
signal_pending( current )―――》检查当前进程是否有信号处理,返回不为0表示有信号需要处理。
if(signal_pending(current)){
ret = -ERESTARTSYS;
return ret;
}
返回-ERESTARTSYS这个值,会触发系统调用再次调用。
参考链接https://blog.csdn.net/qq_33160790/article/details/65450365
2.__set_current_state(TASK_INTERRUPTIBLE),还有哪些状态可以设置,或者含义是什么?
TASK_RUNNING : 进程处于可运行状态,但并不意味着进程已经实际上已分配到 CPU ,它可能会一直等到调度器选中它。该状态只是确保进程一旦被 CPU 选中时立马可以运行,而无需等待外部事件。

TASK_INTERRUPTIBLE : 这是针对等待某事件或其他资源而睡眠的进程设置的。在内核发送信号给该进程时表明等待的事件已经发生或资源已经可用,进程状态变为 TASK_RUNNING,此时只要被调度器选中就立即可恢复运行。

TASK_UNINTERRUPTIBLE : 处于此状态,不能由外部信号唤醒,只能由内核亲自唤醒。

TASK_STOPPED : 表示进程特意停止运行。比如在调试程序时,进程被调试器暂停下来。

TASK_TRACED : 本来不属于进程状态,用于从停止的进程中,将当前被调试的那些进程与常规进程区分开来。

下面常量既可以用于 struct task_struct 的进程状态字段,也可以用于 exit_state 字段(该字段明确的用于退出进程):

EXIT_ZOMBIE : 僵尸状态。

EXIT_DEAD : 处于该状态, 表示 wait 系统调用已经发出,而进程完全从系统移除之前的状态。只有多个线程对同一个进程发出 wait 调用时,该状态才有意义(为了防止其他执行线程在同一个进程也执行wait()类系统调用,而把进程的状态由僵死状态(EXIT_ZOMBIE)改为撤销状态(EXIT_DEAD)。)。

posted @ 2022-05-20 12:41  高山小路  阅读(310)  评论(0)    收藏  举报