我在理解LDD3的以下声明时遇到了一些困难。 " down_interruptible - 它允许等待信号量的用户空间进程被用户中断"。
用户空间应用程序不会直接进行down_interruptible调用。让我们说一个设备驱动程序,并且通过调用down_interruptible触发的设备驱动程序使应用程序进入休眠状态。现在,用户空间应用程序的信号如何从睡眠状态调用应用程序,因为它的设备驱动程序调用了down_interruptible而不是应用程序。
有人请向我澄清这一点。
答案 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);
,否则再次进入睡眠状态。