Страница 1 из 1

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

Добавлено: 2009-05-27 21:24:12
spiderman
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;
}
Подскажите, плз, в какую сторону копать?

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

Добавлено: 2009-05-27 21:29:57
paradox
у вас в корне не правильный подход

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

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

man kevent
или

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

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

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

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

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

Добавлено: 2009-05-27 21:35:25
spiderman
Ок. Спасибо. Я сказал read "повис", чтобы доходчивее было :) Пойду копаться.

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

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

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

Добавлено: 2009-05-29 21:27:14
paradox
вообщем там есть более правильные вызовы
selwakeup
итд на суспенд

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

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

Добавлено: 2009-05-29 22:30:25
spiderman
:)
брр
а как можно отлавливать открытие несуществующего?
Заменить системный вызов open своей функцией )

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

Добавлено: 2009-05-29 22:33:58
paradox
системный вызов всех опен ?
так тогда таблицу вызовов патчишь и все

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

Добавлено: 2009-05-29 22:41:18
spiderman
системный вызов всех опен ?
так тогда таблицу вызовов патчишь и все
угу-мс. я так и сделал. что хотел - то получил.