LINUX.ORG.RU

Вопрос по чтению из буфера.... очень прошу помочь


0

0

У меня есть модуль ядра. Там есть буфер.
Из пользовательской программы я обращаюсь
к нему через собственный системный вызов.
Но вот проблема! Если у меня нет там еще данных,
а процесс уже хочет получить их... То есть в таком
случае у меня реализуется бесконечный цикл до тех пор,
пока данные не прочтутся. Но ведь это жрет ужасно много ресурсов!
Как сделать по другому. Вот ведь есть httpd - он открывает
порт и ждет данных, пока не придет запрос.
Но ресурсы-то не ест! Как так сделать???
Подскажите!!!! Очень нужно. Сигналы, еще как-то?
БОЛЬШОЕ всем СПАСИБО!!!!!


httpd может юзать poll или select, т.е. пока данных нету, он спит.
А с буфером такой финт не прокатит.
Можно делать fifo и писать данные туда. Тогда тебе не надо даже системный вызов делать.
Или в твоем цикле usleep поставить, правда я не знаю, как к этому ядро отнесется.

Havoc ★★★★
()

> бесконечный цикл до тех пор, пока данные не прочтутся.
Извращение. Держать ядро, ожидая данные! Чисто мастдайщеский подход.

Если буфер пустой, модуль должен НЕМЕДЛЕННО вернуть управление,
А ожидание, если уж ОЧЕНЬ хочется, можно засунуть в обертку к
системному вызову. Там можно и сигнала подождать, например --
модуль запоминает все обратившиеся за информацией процессы и шлет
им сигналы.





anonymous
()

ОГРОМНОЕ всем спасибо!

to Havoc (*) (2001-10-29 17:16:57.0)
мне именно буфер этот в ядре нужен

to anonymous (*) (2001-10-29 18:52:03.0)
естесственно, у меня цикл ожидания не в ядре,
иначе оно подвиснет.

есть вот например pause() -
каким сигналом можно прервать ее? У меня например
получается весь процесс прервать стандартными
сигналами типа SIGALRM (когда я ставлю pause()).
Можно конечно написать обработчик собственный для
какого-нибудь SIGUSR1, но ведь наверное есть правильное
уже готовое решение для такой ситуации.

Подскажите пожалуйста!

neshura
() автор топика
Ответ на: комментарий от neshura

> Можно конечно написать обработчик собственный для
> какого-нибудь SIGUSR1, но ведь наверное есть правильное
> уже готовое решение для такой ситуации.

"написать собственный обработчик", вообще говоря, и есть
типа "уже готовое решение" в такой ситуации.

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

anonymous
()

Твой модуль должен помещать все процессы которые к нему обратились при отсутствии данных в очередь ожидания. В результате процесс будет спать до тех пор пока модуль (или кто другой) его оттуда не переведет в run queue. Как тольлько данные есть - пройтись по своей очереди (или как организуеш) и побудить все процессы (или как там тебе надо по логике работы модуля)

tvn
()

to tvn (*) (2001-10-30 15:34:31.0)

Вот в этом и вопрос, я просто не великий в этом деле специалист,
но как это самое сделать? Как мой модуль заставит процесс заснуть,
и как потом его пробудить?
Наверное это не сложно. Но я не знаю как, не знаю с помощью какой
функции или системного вызова сделать это.
Подскажите пожалуйста.
Ну например: syscall_1() to sleep
syscall_2() to run
Вот например sleep() есть, могу я после этого послать процессу
какой-то сигнал, чтобы он с этого места продолжил работу?
Всем БОЛЬШОЕ спасибо!!!

neshura
() автор топика
Ответ на: комментарий от neshura


> Вот например sleep() есть, могу я после этого послать процессу
> какой-то сигнал, чтобы он с этого места продолжил работу?
Можешь, если напишешь свой обработчик (пустой, хотя бы).
Только не надо этого делать, это неправильный путь, хотя работать будет:).

Единственный выход - почитать про очереди в ядре. Вряд ли тебе сюда
соответствующие параграфы из мануалов перепишут...

Удачи!

anonymous
()

Модуль всегда знает процесс который к нему обратился (current) Как работать на уровне ядра - писать действительно долго, поетому рекоммендую почитать как програмировать модули для Линукс, гдето сдесь в форуме пробегали линки на PDF "Linux kernel" && "Linux module programming" - оно конечно на англицком но на русском ничего нет. Еще могу порекомендовать Linux src:)) especially scedule() :))

Дерзай :)

tvn
()

Linux Device Drivers by A.Rubini где на O'Reilly в pdf лежит

- там твое спасенье

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.