Создать структуру диспетчера
#include <sys/iofunc.h>#include <sys/dispatch.h>dispatch_t * dispatch_create( void );
libc
Функция dispatch_create() выделяет память и инициализирует структуру диспетчера. Функции присоединения:
При желании можно вызвать resmgr_attach() с путем, равным NULL
. Это будет иметь эффект инициализации диспетчера для получения сообщений и создания канала.
Канал создается только тогда, когда Вы впервые присоединяете событие, требующее канал (что означает блокировку для получения сообщений). |
Если Вы хотите создать канал самостоятельно (например, для использования name_attach()), вызовите dispatch_create_channel() вместо dispatch_create().
Эта функция является частью уровня диспетчера менеджера ресурсов.
Дескриптор диспетчера или NULL
в случае возникновения ошибки.
Структура диспетчера dispatch_t не является прозрачной; явно получить доступ к ее содержимому нельзя. |
#include <stdio.h>#include <stdlib.h>#include <stddef.h>#include <fcntl.h>#include <sys/iofunc.h>#include <sys/dispatch.h>int my_func( select_context_t *ctp, int fd, unsigned flags, void *handle ){int i, c;/* Do some useful stuff with data */i = read( fd, &c, 1 );fprintf( stderr, "activity on fd %d: read char %c, return code %d\n", fd, c, i );}int main( int argc, char **argv ){dispatch_t *dpp;dispatch_context_t *ctp;select_attr_t attr;int fd, fd2;if ( ( dpp = dispatch_create() ) == NULL ){fprintf( stderr, "%s: Unable to allocate dispatch handle.\n", argv[0] );return (EXIT_FAILURE);}if ( argc ≤ 2 || (fd = open( argv[1], O_RDWR | O_NONBLOCK )) == -1 ){return (EXIT_FAILURE);}if ( argc ≤ 2 || (fd2 = open( argv[2], O_RDWR | O_NONBLOCK )) == -1 ){return (EXIT_FAILURE);}select_attach( dpp, &attr, fd, SELECT_FLAG_READ | SELECT_FLAG_REARM, my_func, NULL );select_attach( dpp, &attr, fd2, SELECT_FLAG_READ | SELECT_FLAG_REARM, my_func, NULL );ctp = dispatch_context_alloc( dpp );for ( ; ; ){if ( ctp = dispatch_block( ctp ) ){dispatch_handler( ctp );}}return (EXIT_SUCCESS);}
Для дополнительных примеров использования интерфейса диспетчера см. message_attach(), resmgr_attach() и thread_pool_create().
ЗОСРВ «Нейтрино»
dispatch_block(), dispatch_context_alloc(), dispatch_create_channel(), dispatch_destroy(), dispatch_handler(), dispatch_timeout(), dispatch_unblock() message_attach(), pulse_attach(), resmgr_attach(), select_attach()
Предыдущий раздел: Описание API системной библиотеки