LINUX.ORG.RU

как это часто бывает на этом форуме, мне кажется,
что я смог бы ответить на ваш вопрос, если бы только
сумел его понять.

в любом случае вам нужен wake_up_... или try_to_wake_up.
вы можете послать сигнал, но разбужен процесс будет именно
с помощью try_to_wake_up.

__wake_up будит очередь, try_to_wake_up - процесс._

idle ★★★★★
()
Ответ на: комментарий от idle

Поясняю: В wait_event_interruptible( outq, flg ) ожидаем очередь outq когда flg будет установлен. И в другой ветке модуля сразу после установке флага делаю wake_up_interruptible( &outq). И wait_event_ возвращает 0. Но в другой ветке мне надо что бы вернул ошибку - сигнал прерывания.

Вот я понял - можно ждать два флага по или, а потом проверять какой установлен и делать выводы, но как сделать так, что бы wait_event_ вернула ошибку (прерывание)??

p_igorek
() автор топика
Ответ на: комментарий от p_igorek

> но как сделать так, что бы wait_event_ вернула ошибку (прерывание)??

да вы на код-то посмотрите, он же тривиальный,
include/linux/wait.h:__wait_event_interruptible()

шлите сигнал, тогда wait_event вернет -ERESTARTSYS.
но только в том случае, если !condition.

вы можете дополнительно проверить signal_pending().

а вообще-то сильно подозреваю неправильный дизайн.

idle ★★★★★
()
Ответ на: комментарий от idle

А как послать сигнал?

И где можно прочитать документацию на фунцции ядра?

Спасибо, P_Igorek

p.s. Дизайн неправильный, просто сначало думал что ни чего этого делать не надо. Но при отладке возникают всякие неожидоности с аппаратурой.

p_igorek
() автор топика
Ответ на: комментарий от p_igorek

> А как послать сигнал?

send_sig() или send_sig_info(), например.

но это, все-таки, неправильный подход

> И где можно прочитать документацию на фунцции ядра?

такой нет, и не надо пытаться представлять ядро в
виде большого набора функций, в этом мало смысла.

Rubini, linux device drivers - очень хорошая книжка,
есть в интернете, где - не знаю.

еще лучше - читайте код.

idle ★★★★★
()
Ответ на: комментарий от idle

Спасибо.

Книжку эту я читаю, но некоторые вещи не очень понятны.

А какой подход, по Вашему мнению, будет правильным?

P_Igorek

p_igorek
() автор топика
Ответ на: комментарий от p_igorek

> А какой подход, по Вашему мнению, будет правильным?

мне трудно судить, я не знаю что у вас там происходит.

но wait_event_interruptible() НЕ возвращает ошибку. ret != 0 означает, что возврат произошел из-за сигнала.

на первый взгляд вам нужно что-то вроде:

int flag; int error;

intr = wait_event_interruptible(wq, (flag || error));

if (error) ..... if (intr) ..... normal_processing();

кроме того, вы можете воспользоваться более низкоуровневым API.

например использовать свою функцию в wait_queue_t->func (cm DEFINE_WAIT()), и будить процесс с помощью __wake_up() передавая ему информацию об ошибке в параметре key.

idle ★★★★★
()
Ответ на: комментарий от p_igorek

форматирование, блин...

> А какой подход, по Вашему мнению, будет правильным?

мне трудно судить, я не знаю что у вас там происходит.

но wait_event_interruptible() НЕ возвращает ошибку.
ret != 0 означает, что возврат произошел из-за сигнала.

на первый взгляд вам нужно что-то вроде:

int flag;
int error;

intr = wait_event_interruptible(wq, (flag || error));

if (error)
        .....
if (intr)
        .....
normal_processing();


кроме того, вы можете воспользоваться более низкоуровневым API.

например использовать свою функцию в wait_queue_t->func
(cm DEFINE_WAIT()), и будить процесс с помощью __wake_up()
передавая ему информацию об ошибке в параметре key.

idle ★★★★★
()
Ответ на: комментарий от idle

Спасибо.

Остановился на двух переменных в ожидании.

P_Igorek

p_igorek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.