Есть ли способ получить данные в модуле ядра без использования функции обратного вызова? - PullRequest
0 голосов
/ 03 апреля 2020

В настоящее время я пишу модуль ядра 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, который решает эту проблему?

Редактировать: Я не являюсь пытаясь исправить код выше. Я просто ищу другие методы / идеи.

...