Linux中的down_interruptible

qgelzfjb  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(172)

我在理解LDD 3中的以下语句时遇到了一些困难。“down_interruptible -它允许一个正在等待信号量的用户空间进程被用户中断”。
一个用户空间的应用程序不会直接调用down_interruptible。假设一个设备驱动程序调用了down_interruptible,并且应用程序被down_interruptible调用触发的设备驱动程序置于睡眠状态。现在,一个给用户空间的应用程序的信号是如何将应用程序从睡眠状态调用的,因为调用down_interruptible的是设备驱动程序,而不是应用程序。
请有人给我澄清一下。

xienkqul

xienkqul1#

任何设备驱动程序都不会自己运行,设备驱动程序通过系统调用代表进程运行。
假设任何设备驱动程序调用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);

字符串
在你的例子中,进程被添加到等待队列,等待条件释放它。同时它也检查任何挂起的信号,如果有,它将返回-ERESTARTSYS,否则再次进入睡眠。

相关问题