Linux中的down_interruptible

时间:2015-10-08 05:16:58

标签: linux linux-kernel linux-device-driver

我在理解LDD3的以下声明时遇到了一些困难。 " down_interruptible - 它允许等待信号量的用户空间进程被用户中断"。

用户空间应用程序不会直接进行down_interruptible调用。让我们说一个设备驱动程序,并且通过调用down_interruptible触发的设备驱动程序使应用程序进入休眠状态。现在,用户空间应用程序的信号如何从睡眠状态调用应用程序,因为它的设备驱动程序调用了down_interruptible而不是应用程序。

有人请向我澄清这一点。

1 个答案:

答案 0 :(得分:9)

任何设备驱动程序都没有自己运行,设备驱动程序通过系统调用代表进程运行。

假设任何设备驱动程序调用{​​{1}},这意味着如果信号量不可用,则相应的进程将被置于信号量等待队列中。 任务状态将更改为down_interruptible();,并且将调用调度程序以运行任何其他进程。现在,睡眠过程可以通过事件等待(信号量)或信号唤醒。

示例:TASK_INTERRUPTIBLE将导致进程将其状态更改为kill -SIGINT <pid>,并将进程添加到运行队列。

这是等待队列的伪代码,进程如何等待任何事件。

TASK_RUNNING

在您的示例中,该进程被添加到等待队列并等待条件释放它。同时它还检查任何未决信号,如果有,它将返回/* ‘q’ is the wait queue we wish to sleep on */ DEFINE_WAIT(wait); add_wait_queue(q, &wait); while (!condition) /* condition is the event that we are waiting for */ { prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE); if (!signal_pending(current)) { schedule(); continue; } ret = -ERESTARTSYS; } finish_wait(&q, &wait); ,否则再次进入睡眠状态。