2008-11-24 2 views
2

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

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

ответ

5

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

1

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

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

1

/proc isn't actually a real file system; он построен ядром на основе того, что в настоящее время работает. Я не думаю, что вы можете создавать в нем именованные каналы.

+0

Вы можете на самом деле * создать * их (я сделал), хотя я не уверен, насколько они функциональны. – 2008-11-24 04:35:17

3

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

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

Смежные вопросы