dispatch_create()

Создать структуру диспетчера

Прототип:

#include <sys/iofunc.h>
#include <sys/dispatch.h>
dispatch_t * dispatch_create( void );

Библиотека:

libc

Описание:

Функция dispatch_create() выделяет память и инициализирует структуру диспетчера. Функции присоединения:

При желании можно вызвать resmgr_attach() с путем, равным NULL. Это будет иметь эффект инициализации диспетчера для получения сообщений и создания канала.


Note: Канал создается только тогда, когда Вы впервые присоединяете событие, требующее канал (что означает блокировку для получения сообщений).

Если Вы хотите создать канал самостоятельно (например, для использования name_attach()), вызовите dispatch_create_channel() вместо dispatch_create().

Эта функция является частью уровня диспетчера менеджера ресурсов.

Возвращаемое значение:

Дескриптор диспетчера или NULL в случае возникновения ошибки.


Note: Структура диспетчера dispatch_t не является прозрачной; явно получить доступ к ее содержимому нельзя.

Коды ошибок:

ENOMEM
Недостаточно памяти для создания контекста.

Примеры:

#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 системной библиотеки