Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: Блокировка   Maxim Sobolev   07 Apr 2000 12:58:31 
Архивное /ru.unix.bsd/79230c9f080e.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional