Исходя из ваших комментариев, кажется, что вы хотите, чтобы B мог получать сообщения, но когда он получает "сигнальное" сообщение, ему нужно действовать так, как будто он получил обычный сигнал.Вы упомянули, что B должен реагировать на SIGTERM
или SIGINT
из сообщения "signal".
Способ достижения этого зависит от использования очередей сообщений POSIX или очередей сообщений System V.
В любом случае кажется, что вы не хотите использовать опрос очереди сообщений основным потоком B, поскольку это увеличит задержку при ответе на "сигнальное" сообщение.
Таким образом, с очередями сообщений POSIX вы можете использовать mq_notify()
, чтобы запустить поток или подать сигнал о получении нового сообщения.В противном случае B может использовать поток (или даже fork()
) для опроса очереди сообщений.
После получения «сигнального» сообщения у вас есть несколько вариантов.A) Вы можете использовать kill
или raise
в B, чтобы отправить сигнал правильного типа себе (или родительскому в случае fork
), или B) просто вызвать функцию, которая делает то, что вы хотите (чтовроде вещи).
Процесс A может отправлять «сигнальное» сообщение, когда захочет.Но вы должны понимать, что если вы используете именованные очереди, они являются постоянными.То есть A может отправлять «сигнальное» сообщение еще до того, как B запускается, а затем, когда B запускается, это сообщение ожидает там.В зависимости от того, как устроена очередь сообщений, она может быть N сообщений глубиной и иметь более старые сообщения в очереди.Один из способов справиться с этим - очистить очередь B перед обработкой любого из сообщений.