Заблокировать процесс-сервер в ожидании сообщений
#include <sys/iofunc.h>#include <sys/dispatch.h>dispatch_context_t * dispatch_block( dispatch_context_t *ctp );
dispatch_context_t
, определяющую контекст диспетчера.libc
Функция dispatch_block() блокируется в ожидании события (например, сообщения или сигнала), зарегистрированного с помощью какой-либо функции присоединения, message_attach(), pulse_attach(), resmgr_attach() или select_attach(). (На данный момент функция sigwait_attach() не реализована.)
Тип блокировки: | dispatch_block() выполняет: |
---|---|
сообщение (resmgr, message, select) | MsgReceive() |
сигнал | SignalWaitinfo() |
Эта функция является частью уровня диспетчера менеджера ресурсов.
Контекст диспетчера, переданный в dispatch_context_alloc(). Если возникла ошибка, функция возвращает NULL
, код ошибки записывается в errno.
Ошибки могут возникнуть, когда блокирующий вызов ядра возвращается с ошибкой, например, из-за доставки сигнала.
В случае таймаута возвращается корректный контекст диспетчера, но либо ctp->message_context.rcvid, либо ctp->sigwait_context.signo устанавливаются в -1 . |
Если возвращается отличный от NULL
указатель на контекст, он может отличаться от переданного в функцию, так как для ctp возможно перераспределение в сторону большего размера. В этом случае, старый ctp более недействителен. Однако, если возвращается NULL
(например, MsgReceive() был прерван сигналом), старый указатель контекста все еще действителен. Обычно менеджер ресурсов направляет сигналы в поток, предназначенный для обработки сигналов. Однако, если сигнал направляется в поток, выполняющий dispatch_block(), можно использовать следующий код:
dispatch_context_t *ctp, *new_ctp;ctp = dispatch_context_alloc( ... );while( 1 ){new_ctp = dispatch_block( ctp );if ( new_ctp ){ctp = new_ctp} else {/* handle the error condition */...}}
Смотрите также константы ошибок, возвращаемые MsgReceive() и SignalWaitinfo().
#include <sys/dispatch.h>int main( int argc, char **argv ){dispatch_context_t *ctp;...for ( ; ; ){if ( ctp = dispatch_block( ctp ) ){dispatch_handler( ctp );}}}
Другие примеры, использующие интерфейс диспетчера см. на страницах dispatch_create(), message_attach(), resmgr_attach() и thread_pool_create().
ЗОСРВ «Нейтрино»
dispatch_context_alloc(), dispatch_create(), dispatch_create_channel(), dispatch_handler(), dispatch_timeout(), dispatch_unblock(), MsgReceive()
Предыдущий раздел: Описание API системной библиотеки