Ядро Linux / proc FIFO / pipe

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
5 115
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

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

Фактически вы можете Создайте их (я сделал), хотя я не уверен, насколько они функциональны.

Dan Fego 24.11.2008 07:35

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

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

Есть несколько хороших предложений. Ядро поддерживает несколько способов:

  • устройство персонажа / блока, предложенное Аной Беттс и Майклом Траушем
  • устройство mmap (например, вы можете получить доступ как / proc / memshare / mybuffer)
  • кастомная система. Написание модуля ядра означает, что вы действительно можете создать свой собственный метод доступа к объекту proc. В ядре этого много примеров.

Надеюсь это поможет.

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