Вопрос

В настоящее время я пытаюсь создать модуль ядра, который будет генерировать данные на основе событий ядра и передавать их в файл.Прочитав, что это плохо (и я согласен), я решил, что было бы разумнее хранить данные в файле /proc, из которого пользовательская программа могла бы извлекать данные при необходимости.Однако эта идея привела ко всевозможным проблемам, особенно когда и как очистить этот файл.Так я и думал..."почему бы мне не создать именованный канал в /proc и не прочитать из него?"

Я понял общую суть настройки функции чтения и функции записи для файла proc, но у меня все еще возникают концептуальные проблемы с тем, как я буду это делать.А именно, как бы я написал такую функцию, чтобы брать произвольные данные и записывать их в такой канал из ядра?У кого-нибудь есть какие-нибудь идеи, как вы будете передавать данные в именованный канал из пространства ядра?В конце концов, это не так иметь быть файлом /proc (особенно, если с моей стороны это неправильно), но именно к такому выводу я пришел.Затем мне нужно будет выяснить, как подключиться к нему из пользовательской программы, но я чувствую, что это отдельная проблема.

Это было полезно?

Решение

Вместо создания именованного канала, то, что вы хотите сделать, это создать "Символьное устройство".Если вам нужно простое взаимодействие или потоковая передача данных из ядра в пространство пользователя и обратно, это обычный метод.Я бы порекомендовал поискать похожие устройства в ядре Linux и посмотреть, что они делают.

Другие советы

Я думаю, что обычно это делается с помощью сокета netlink;один или несколько процессов пользовательского пространства могут привязываться к адресу "netlink", и ваше ядро может транслировать сообщения любому / всем из них по мере необходимости.

Это, безусловно, то, что делают некоторые вещи, особенно сетевая подсистема.Программа пользовательского пространства может отслеживать изменения в сетевых интерфейсах (например,новые IP-адреса, изменение статуса ссылки) с использованием этого метода.

Я согласен с Полом — внедрение символьного устройства, вероятно, лучший способ.Возможно, глядя на код, реализующий /dev/kmem или /dev / rtc [0-9].Кроме того, последовательные драйверы реализуют свои драйверы с использованием символьных устройств.

Просто думайте об этом как о виртуальном устройстве.:-)

/процесс на самом деле это не настоящая файловая система;он создается ядром на основе того, что запущено в данный момент.Я не думаю, что вы можете создавать в нем именованные каналы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top