|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Maxim Sobolev 2:5020/400 07 Apr 2000 12:58:31 To : All Subject : Re: Блокировка -------------------------------------------------------------------------------- "Dmitry S. Rzhavin" wrote: > Maxim Sobolev wrote: > > > > Sergey Budnitsky wrote: > > > > > Есть прога, которая ничего не делает, кроме как сидит и ждет > > > прихода разных сигналов и по пришествию их обрабатывает. Соот. в > > > перерывах между сигналами ее нужно как-то занять. Делать while(1) или > > > sleep(100000000) не хочется. Сейчас для этих целей, блокировка программы > > > до прихода сигнала, используется select(0,0,0,0,0). Интересует, > > > есть-ли специальные функции делающие такое (ждущие прихода любого сигнала > > > и отваливающиеся с EINTR)? > > > > Hу может быть nanosleep() > > > > > Если таковых не имеется, то > > > насколько правильно (безопасно, эффективно, ....) такое использование > > > select() в этих целях? > > > > Абсолютно нормально и правильно. Более того, это практически единственная > > подобная функция работающая практически одинаково на разных унихах. -Maxim > > У меня несколько похожая задача, даже две: > 1) надо сделать нечто такое: > for(;;) { > ... // некий код > if (zhopa) { > // надо остановиться и ничего не делать, > // пока не придет сигнал. После того, как > // придет сигнал, он будет обработан, а мне > // надо просто продолжить (!!!) с этого места > } > ... // опять код > } ежели попроще - то nanosleep(), select() а ежели посложнее - то sigsuspend() > 2) Есть некий процесс, сидит и ловит UDP. Пакеты могут поступать > очень часто, а обработка пакета может занять тучу времени. Терять > пакеты ооочень не хочется (повторять их никто не будет, а надежность > линии и так не гарантирована). Скорее всего, надо разделить на 2 > процесса: один сидит, ловит пакеты и скармливает их второму. Второй > уже их обрабатывает. Вопрос: как обеспечить достаточно большой буфер > для обмена (чтобы 1й никогда не вис из-за невозможности в него > записать), Это будет переусложнением. Достаточно будет во время обработки уже пришедших пакетов периодически проверять приемный буфер (он вроде по умолчанию 16K, так что тебе будет несложно посчитать с какой периодичностью надо будет это делать исходя из полосы пропускания) и в случае прихода пакета сбрасывать его в некий более объемный внутренний буффер, который в принципе может быть динамически выделяемым дабы избежать переполнения. При этом, ессно при открытии сокета ему надо дать O_NONBLOCK, дабы избежать блокировки ежели не пришло новых данных. Будет что-то подобное checkpacket() { while(recv(blabla)!=-1) { fill the internal buffer with received data } } processpackets() { for(blabla) { checkpacket(); do-processing(); } } > а при этом 2й наоборот автоматически стопился, если буфер пуст (а не > висел в вечном цикле с проверкой буфера)? -Maxim --- ifmail v.2.15dev4 * Origin: Vega International Capital (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/79230c9f080e.html, оценка из 5, голосов 10
|