当前位置: 技术问答>linux和unix
Linux 0.12内核中关于__sleep_on()函数的一点疑问,谢谢各位大哥帮忙解答啦。
来源: 互联网 发布时间:2016-06-01
本文导语: static inline void __sleep_on(struct task_struct **p, int state) { … repeat: schedule(); if (*p && *p != current) { (**p).state = 0; current->state = TASK_UNINTERRUPTIBLE; goto repeat; } … } 以上sleep_on()函数让小弟不解的是,如果当前进...
static inline void __sleep_on(struct task_struct **p, int state)
{
…
repeat: schedule();
if (*p && *p != current) {
(**p).state = 0;
current->state = TASK_UNINTERRUPTIBLE;
goto repeat;
}
…
}
以上sleep_on()函数让小弟不解的是,如果当前进程被唤醒了,并且等待队列头指针!= 当前进程。
是否说明当前进程不是被等待队列上的前一个进程唤醒的,而有可能是收到了singal。
这时,为什么要去唤醒等待队列头指针指向的进程呢?如果是因为收到信号而被唤醒的,不是有问题吗。
{
…
repeat: schedule();
if (*p && *p != current) {
(**p).state = 0;
current->state = TASK_UNINTERRUPTIBLE;
goto repeat;
}
…
}
以上sleep_on()函数让小弟不解的是,如果当前进程被唤醒了,并且等待队列头指针!= 当前进程。
是否说明当前进程不是被等待队列上的前一个进程唤醒的,而有可能是收到了singal。
这时,为什么要去唤醒等待队列头指针指向的进程呢?如果是因为收到信号而被唤醒的,不是有问题吗。
|
sleep_on(struct task_struct **p)
参数是自己定义的等待队列的头指针,
用处是把自己,也就是当前进程(current)挂到自己定义等待队列上去,并且是这个等待队列的队首。
就是让*p指向你的当前进程,而原来*p所指向的进程由tmp指向。
参数是自己定义的等待队列的头指针,
用处是把自己,也就是当前进程(current)挂到自己定义等待队列上去,并且是这个等待队列的队首。
就是让*p指向你的当前进程,而原来*p所指向的进程由tmp指向。