Можно ли использовать циклы событий glib для IPC?

Можно ли использовать циклы событий glib и каналы glib io для IPC в модели «один родительский — много дочерних процессов»?

Родитель и дети должны иметь возможность посылать друг другу «команды».

Можете ли вы указать мне некоторые учебники или примеры?


person Marko Kevac    schedule 23.06.2010    source источник


Ответы (1)


да. Но он сам по себе не содержит полного решения IPC и, вероятно, не полностью совместим со всеми имеющимися реализациями IPC. С родителем и детьми, я думаю, вы имеете в виду сервер и клиентов? Обычно вы открываете какое-то сетевое соединение или создаете канал для связи и получаете дескриптор файла (даже если вы используете библиотеку высокого уровня, которая скрывает это). Вы можете передать этот файловый дескриптор в glib и получить обратный вызов, после чего данные будут доступны для чтения (или соединение будет закрыто). Некоторые популярные методы IPC, такие как CORBA и DBUS уже имеет интеграцию с glib, поэтому вам даже не нужно возиться с файловыми дескрипторами и тому подобным. Цикл событий glib описан здесь. Это может показаться чрезвычайно сложным по сравнению с простым использованием poll() напрямую, но, с другой стороны, это очень портативно.

Основное использование состоит в том, чтобы создать источник с помощью g_source_new() и добавить его в ваш основной контекст с помощью g_source_attach(), а затем добавить дескриптор файла к источнику с помощью g_source_add_poll().

Если вы еще не выбрали glib, вы можете проверить libevent, который делает то же самое. вещь как бойкая, но (ИМХО) намного проще в использовании. Он также значительно лучше справляется с 1000+ одновременных клиентов (по крайней мере, в Linux, другие операционные системы могут даже не поддерживать это). Но, с другой стороны, он не такой портативный и, вероятно, будет работать только на достаточно совместимых с posix системах.

person Grim    schedule 30.06.2010
comment
Нет, не сервер и клиенты. У меня есть родительский (главный) процесс и около 10 детей. Я хочу, чтобы дети слушали родительские команды (например, die(), reload_config(), do_this(), do_that()), а родители слушали дочерние команды (например, i_have_finished()). Мне не нужно 1000 одновременных клиентов, всего около 10. И команды редко. - person Marko Kevac; 30.06.2010
comment
Если дочерние процессы являются локальными процессами, запущенными мастером, то это простая задача, которую может решить только glib (если дочерние элементы удалены, вам нужно настроить это самостоятельно, но в остальном это не сильно отличается). Вы можете использовать g_spawn_async_with_pipes() для запуска дочернего процесса и получения файловых дескрипторов (которые будут использоваться, как описано выше). Вы также получаете PID, который можно использовать для получения обратного вызова, после чего дочерний процесс завершается с помощью g_child_watch_add(). - person Grim; 02.07.2010