Имитация файлового дескриптора в пространстве пользователя - PullRequest
2 голосов
/ 26 мая 2009

Я хотел бы реализовать сокетоподобный объект в пространстве пользователя. Существует важное требование, что он должен быть опрашиваемым (то есть его состояние должно запрашиваться с помощью вызова select или опроса).

Есть ли платформо-независимый способ реализации такого объекта?

Я знаю, что в Linux есть eventfd, который удовлетворяет потребностям, за исключением того, что нет способа заставить его сигнализировать ни POLLIN, ни POLLOUT.

Ответы [ 4 ]

2 голосов
/ 27 мая 2009

Вы можете использовать socketpair () для создания пары подключенных сокетов AF_UNIX. Это лучше, чем pipe (), поскольку допускает двунаправленную связь. Если этого недостаточно для ваших нужд, другой вариант (для которого требуется демон root) - использовать патчи пока еще не в mainline-Linux CUSE для создания драйвера устройства. в пространстве пользователя делать все, что угодно. Или вы можете просто подключиться к любому циклу событий, который будет использовать ваш пользователь ...

Новый linux eventfd также может эмулировать POLLIN / POLLOUT, хотя не одновременно оба - установите его значение равным 0xfffffffffffffffe для POLLIN, но не POLLOUT, 0 для POLLOUT, но не POLLIN, или что-то еще для обоих.

Кроме этих опций, нет платформенно-нейтрального способа сделать это, нет. Обычный шаблон - использовать FIFO только для пробуждения цикла событий и опрашивать его, используя какой-то другой API, как только он проснется.

1 голос
/ 26 мая 2009

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

Вам нужна либо поддержка ядра, либо поддержка libc, иначе я не вижу, как вы можете перенаправить системный вызов.

eventfd - это не то, что вы запрашиваете, оно реализовано в пространстве ядра. Вы описали свою реальную проблему? Может ли fifo или сокет домена unix соответствовать вашим потребностям?

А как насчет pseudo tty ? Я не знаю, можете ли вы заблокировать запись со стороны мастера, подделав аппаратный контроль потока.

0 голосов
/ 27 мая 2009

Использовать трубу (). Это дает вам два ФД, один для записи, один для чтения. Используйте fd [1] для выбора / опроса.
Используйте fd [0], чтобы подать сигнал выбора / опроса активности.

0 голосов
/ 26 мая 2009

Не совсем понятно, что вы пытаетесь сделать; если вы хотите устройство типа сокета, почему бы не использовать сокеты? Вы не говорите ... А что за дела с Поллином и Поллутом?

Я подозреваю, что вас может заинтересовать использование псевдо-терминальных устройств, см. Man 7 pty.

...