Сохранение информации в системе ввода-вывода - PullRequest
4 голосов
/ 19 мая 2010

Мне нужно написать модуль ядра, который имитирует «мультикастер» с использованием файловой системы / proc.

В основном необходимо поддерживать следующие сценарии:

1) разрешить один доступ на запись в файл / proc и несколько обращений на чтение в файл / proc.

2) Модуль должен иметь буфер содержимого последней успешной записи. Каждая запись должна соответствовать чтению всех читателей.

Рассмотрим сценарий 2: писатель что-то написал, и есть два читателя (A и B), A прочитал содержимое буфера, а затем A попытался снова прочитать, в этом случае он должен перейти в wait_queue и ждать следующее сообщение должно не снова получить тот же буфер.

Мне нужно сохранить карту всех pid, которые уже читают текущий буфер, и в случае, если они попытаются прочитать снова, и буфер не был изменен, они должны быть заблокированы, пока не появится новый буфер. Я пытаюсь понять, что есть способ сохранить эту информацию без карты. Я слышал, что в системе ввода-вывода есть несколько избыточных полей, которые я могу использовать для пометки процесса, если он уже читает текущий буфер.

Может кто-нибудь дать мне совет, где мне искать это поле? как я могу сохранить информацию о текущем процессе, не сохраняя «карту» pid и буферов?

Спасибо!

1 Ответ

1 голос
/ 19 мая 2010

Не пытайтесь поддерживать его на основе PID - это просто неправильный уровень абстракции.

Каждый раз, когда файл открывается, создается новый struct file, который ссылается на этот экземпляр открытого файла. Сохраните информацию (самый последний буфер, который был прочитан данным struct file) в самом struct file.

Вы можете использовать указатель private_data в struct file для хранения необходимой информации. Вот для чего это.

...