Как я могу написать кроссплатформенный C ++, который обрабатывает сигналы? - PullRequest
3 голосов
/ 01 февраля 2012

Этот вопрос больше для моего личного любопытства, чем что-либо важное.Я стараюсь, чтобы весь мой код был совместим хотя бы с Windows и Mac.До сих пор я узнал, что должен основывать свой код на POSIX, и это просто замечательно, но ...

В Windows нет функции sigaction, поэтому используется signal?Согласно: В чем разница между сигналом и сигналом? Есть некоторые проблемы с сигналом.

  1. Функция signal () не блокирует поступление других сигналов во времятекущий обработчик выполняется;sigaction () может блокировать другие сигналы до тех пор, пока не вернется текущий обработчик.
  2. Функция signal () сбрасывает действие сигнала обратно в SIG_DFL (по умолчанию) для почти всех сигналов.Это означает, что обработчик signal () должен переустановить себя в качестве первого действия.Он также открывает окно уязвимости между моментом обнаружения сигнала и переустановкой обработчика, в течение которого, если поступает второй экземпляр сигнала, происходит поведение по умолчанию (обычно завершается, иногда с предубеждением - иначе дамп ядра).

Если два SIGINT приходят быстро, приложение завершает работу по умолчанию.Есть ли способ исправить это поведение?Какие еще последствия имеют эти две проблемы для процесса, который, например, хочет заблокировать SIGINT?Есть ли другие проблемы, с которыми я могу столкнуться при использовании сигнала?Как мне их исправить?

1 Ответ

4 голосов
/ 01 февраля 2012

Вы действительно не хотите иметь дело с signal ().

Вы хотите "события".

В идеале вы должны найти среду, переносимую для всех основных сред, на которые вы хотите ориентироваться, - которые будут определять ваш выбор реализации «события».

Вот интересная ветка, которая может помочь:

Игровые объекты, говорящие друг с другом

PS: Основное различие между signal () и sigaction () состоит в том, что sigaction () - это «signal ()» на стероидах - больше опций, позволяет SA_RESTART и т. Д. Я бы не рекомендовал использовать любой из них, если вам действительно не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...