|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Yar Tikhiy 2:5020/118 07 Apr 2000 16:37:40 To : "Dmitry S. Rzhavin" Subject : Re: Блокировка --------------------------------------------------------------------------------
DSR> 2) Есть некий процесс, сидит и ловит UDP. Пакеты могут поступать
DSR> очень часто, а обработка пакета может занять тучу времени. Терять
DSR> пакеты ооочень не хочется (повторять их никто не будет, а надежность
DSR> линии и так не гарантирована). Скорее всего, надо разделить на 2
DSR> процесса: один сидит, ловит пакеты и скармливает их второму. Второй
DSR> уже их обрабатывает. Вопрос: как обеспечить достаточно большой буфер
DSR> для обмена (чтобы 1й никогда не вис из-за невозможности в него
DSR> записать),
DSR> а при этом 2й наоборот автоматически стопился, если буфер пуст (а не
DSR> висел в вечном цикле с проверкой буфера)?
Non-blocking i/o спасет тебя :-) То есть процесс 1 должен открыть
udp и ipc сокеты в режиме O_NONBLOCK и в цикле делать с помощью
select/poll следующее:
- select/poll на оба сокета;
- если есть udp данные - прочесть и записать в буфер;
- если можно записать в ipc сокет, а буфер не пуст - извлечь из буфера
и записать в ipc сокет.
Во втором процессе можно просто открыть ipc-соединение (тогда
ввод-вывод будет по умолчанию блокирующим), тогда read/recv будет
блокироваться при отсутствии данных и ждать их поступления.
SY, Yar
--- ifmail v.2.15dev4
* Origin: Chemistry Dept. of Moscow State University (2:5020/118)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/116839a10abdb.html, оценка из 5, голосов 10
|