вопрос по модулю для freebsd

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
spiderman
проходил мимо

вопрос по модулю для freebsd

Непрочитанное сообщение spiderman » 2009-05-27 21:24:12

Freebsd 8-current.
Написал модуль ядра. Он создаёт в /dev файлик boost. В нём определены функции open,close,read и write. По стандарту флаг match(он определён только в этом модуле) равен 0. Он отлавливает вызов open к определённым файлам. И когда кто-то открывает определённый файл, то модуль устанавливает флаг match в 1. Так вот... Будет висеть в системе даемон, типа этого:

Код: Выделить всё

int k = 0;
int fd = open("/dev/boost", O_RDONLY);
do {
read(fd, &k, sizeof(int));
} while(k!=-1);
close(fd);
Нужно сделать так, чтобы фунция read повисла, переводя даемон в состояние idle, до тех пор, пока k не будет отлична от 0.(типа как accept переводит процесс в состояние idle до тех пор, пока не подконектяться..). Код read для boost:

Код: Выделить всё

int boost_read(struct cdev *dev, struct uio *uio, int flag) {
//     sleep until match=1
     memcpy((int *)uio->uio_iov->iov_base, &match, sizeof(int));
     match = 0;
     return 0;
}
Подскажите, плз, в какую сторону копать?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: вопрос по модулю для freebsd

Непрочитанное сообщение paradox » 2009-05-27 21:29:57

у вас в корне не правильный подход

read не может "повиснуть"
"повиснуть" может евент

Код: Выделить всё

man kevent
или

Код: Выделить всё

man poll
это в юзер спейсе

в кернел спейсе
для kevent
отдельно kq структуры для инициализации определены

а для poll
метод в девайсе poll

spiderman
проходил мимо

Re: вопрос по модулю для freebsd

Непрочитанное сообщение spiderman » 2009-05-27 21:35:25

Ок. Спасибо. Я сказал read "повис", чтобы доходчивее было :) Пойду копаться.

spiderman
проходил мимо

Re: вопрос по модулю для freebsd

Непрочитанное сообщение spiderman » 2009-05-29 18:16:09

С kevent покопался и вроде он только работает с открытым файлом. Для отлавливания открытия несуществующего файла, кроме как перехватывать open, я чё-то другого пути не надумал. В общем, если кому понадобиться: thr_suspend + wakeup (замораживает и размараживает процесс). То, что я и искал :)

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: вопрос по модулю для freebsd

Непрочитанное сообщение paradox » 2009-05-29 21:27:14

вообщем там есть более правильные вызовы
selwakeup
итд на суспенд

брр
а как можно отлавливать открытие несуществующего?

spiderman
проходил мимо

Re: вопрос по модулю для freebsd

Непрочитанное сообщение spiderman » 2009-05-29 22:30:25

:)
брр
а как можно отлавливать открытие несуществующего?
Заменить системный вызов open своей функцией )

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: вопрос по модулю для freebsd

Непрочитанное сообщение paradox » 2009-05-29 22:33:58

системный вызов всех опен ?
так тогда таблицу вызовов патчишь и все

spiderman
проходил мимо

Re: вопрос по модулю для freebsd

Непрочитанное сообщение spiderman » 2009-05-29 22:41:18

системный вызов всех опен ?
так тогда таблицу вызовов патчишь и все
угу-мс. я так и сделал. что хотел - то получил.