В настоящее время я пишу модуль ядра Linux, в котором я должен отправлять запросы в приложение пользовательского пространства из функции обратного вызова.
Так что мне нужно в моем модуле что-то вроде этого:
int callback_function () {
...
send_request_to_app();
receive_answer();
...
}
Я пытался использовать generi c netlink в сочетании с wait_queues примерно так:
int response = 0;
DECLARE_WAIT_QUEUE_HEAD(wait_queue);
static int nl_recv_msg(struct sk_buff *skb, struct genl_info* info) {
...
response = 1;
wake_up_interruptible(&wait_queue);
...
}
int callback_function () {
...
send_request_to_app();
wait_event_interruptible(wait_queue, response);
...
}
Аналогично этому вопросу: Как отправлять и получать сообщения из функции other чем зарегистрированная функция обратного вызова в сокете Netlink?
Это не работает для меня, что, я считаю, может быть связано с условиями гонки, поскольку callback_function
часто вызывается.
Есть ли другой способ получить ответ без использования другой функции обратного вызова или есть другой метод IP C, который решает эту проблему?
Редактировать: Я не являюсь пытаясь исправить код выше. Я просто ищу другие методы / идеи.