Если я посылаю кучу сигналов SIGIO процессу, и этот процесс блокирует сигналы SIGIO и делает что-то еще. Когда я разблокирую сигнал, будет ли один сигнал SIGIO или несколько сигналов SIGIO в последовательности?Каково поведение блокировки сигнала?
ответ
Ответ - это зависит.
Сначала передаваемый сигнал обрабатывается методом обработчика. Для обработчика есть две части: верхняя и нижняя. Верх должен быть быстрым, он должен получить сигнал и установить некоторый флаг и вернуться. Нижняя часть проверяет этот флаг и затем отвечает. Теперь какая-то система Linux/UNIX сбрасывает обработчик на значение по умолчанию, когда происходит сигнал (так что вам нужно сбросить sigaction для этого сигнала в вашем обработчике).
Сигналы будут стоять в очереди, но только несколько (в зависимости от реализации). Если вы посылаете сигнал с помощью сигналов, вы можете потерять все те, которые возникают после заполнения очереди.
Посмотрите на сигнал и сигмацию на страницах руководства.
Решения AIX/Linux. Сначала установите обработчик.
sigset_t mask;
sigemptyset(&mask);
#ifdef AIX
exitaction.sa_handler = C_signalExit;
exitaction.sa_mask = mask;
exitaction.sa_flags = SA_OLDSTYLE;
#else // LINUX
sigaddset(&mask, SIGHUP);
sigaddset(&mask, SIGQUIT);
sigaddset(&mask, SIGTERM);
exitaction.sa_sigaction = C_signalActionExit;
exitaction.sa_mask = mask;
exitaction.sa_flags = SA_SIGINFO;
#endif
Теперь код обработчика (вверху) - Обратите внимание, здесь я должен был «придать обходной путь» для обработки сигналов на Linux (но по-прежнему держать код совместим с AIX) SystemOS класс, который обрабатывает сигналы и другие Операции, связанные с ОС.
#ifdef AIX
void C_signalExit(int signal) { sys->signalExit(signal,0,NULL); }
void SystemOS::signalExit(int signal, int code, struct sigcontext *sigcon)
#else // LINUX
void C_signalActionExit(int signal, siginfo_t* siginfo, void *data)
{ sys->actionExit(signal,siginfo,data); }
void SystemOS::actionExit(int signal, siginfo_t* siginfo, void* data)
#endif
{
switch(signal)
{
case SIGINT : // interrupt from keyboard (^C ??)
case SIGKILL : // can't be caught or ignored // 080209 can't be blocked with sigblock() fields set si_pid,si_uid - see sigqueue(3)
case SIGTSTP : // ^Z
case SIGTTIN : // background read
case SIGTTOU : // background rite
#ifdef AIX
case SIGDANGER: // disk space
case SIGPRE : // program exception
case SIGSAK : // secure attention
#endif
default :
exec.kill(signal,SIGNAL_ERROR); // exec is the 'main program'
}
}
Ex.kill будет нижней половиной - он принимает сигнал и значение и убьет приложение. Вы бы иметь некоторую другую функцию там (это не стандартный метод - но часть моей структуры приложения
Я надеюсь, что это помогает
PS: инструкция switch существует для будущего расширения - в случае необходимости конкретного другого действия , В этом примере все сигналы обрабатываются по умолчанию (то есть все случаи «впадают» в последний случай (по умолчанию: case)) – Thaddeus
- 1. Каково поведение getAttributeNS?
- 2. Каково поведение следующего кода?
- 3. Каково ожидаемое поведение _NET_WM_STATE_MODAL?
- 4. Каково ожидаемое поведение?
- 5. Каково поведение сериализации EntryProcessor?
- 6. Каково поведение рандомизации CNTKWindow?
- 7. Каково поведение следующего кода?
- 8. Каково определение «поведение ViewModel»?
- 9. Каково поведение CloudBlockBlob.UploadText?
- 10. Обработка сигнала странное поведение
- 11. Получение сигнала SIGSEGV во время его блокировки
- 12. Иерархическое поведение блокировки CLH
- 13. поведение экрана блокировки Android
- 14. Каково поведение (.) + В регулярном выражении?
- 15. Каково точное поведение инструкции INT?
- 16. Каково поведение перекрывающихся барьеров изображения?
- 17. Каково точное поведение выполнения CUDA?
- 18. Каково точное поведение Windows SetEvent?
- 19. Каково поведение int & a = * b?
- 20. Каково будет поведение линии-seq?
- 21. Каково ожидаемое поведение для strincmp?
- 22. Каково поведение «где» в рубине?
- 23. Каково внутреннее поведение обработки исключений?
- 24. Каково намерение вызвать экран «Экран блокировки экрана»?
- 25. Непостоянное поведение сигнала? Работает только для первого сигнала?
- 26. Каково ожидаемое поведение присвоения undef или '' хешам% SIG?
- 27. Каково ожидаемое поведение откат/откат Camus?
- 28. ActiveRecord, MySQL и вложенные транзакции - каково поведение?
- 29. Каково поведение массива в этой программе?
- 30. Каково поведение стирания `end()` `std :: list`?
Я оставляю это как комментарий, а затем ответ, в исследовании этого некоторое время.. назад дал мне головную боль, и я не уверен, что все в порядке ... из того, что я понял, ответ «Да» ... он даст вам либо несколько сигналов, либо один сигнал, это как сигнал и зависит от реализации. Большинство сигналов будут слиты (только один сигнал будет получен), но некоторые могут сохраняться (некоторые сигналы ввода-вывода переносят метаданные, которые не должны сливаться, это может быть зависимым от ОС) ... удача с охотой . ** Я рекомендую вам указать, какие сигналы вы запрашиваете **. – Myst
Будет ли одна или несколько доставки, ответ зависит от этого. возможный дубликат этого: http://stackoverflow.com/questions/6343871/about-the-delivery-of-standard-signals – fluter