Безопасно ли использовать SIGRTMIN и SIGRTMAX в обработчиках сигналов? - PullRequest
2 голосов
/ 29 декабря 2011

Код, с которым я работаю, имеет общий обработчик сигнала, который включает номер сигнала для его правильной обработки.

Я добавляю пользовательский сигнал.Примерно так

static void signal_handler (int s)
{
    if ( s == SIGTERM ) clean_up () ;

    else if ( s == SIGRTMIN+1 ) ; // do nothing
}

SIGRTMIN и SIGRTMAX являются #dedefines вызовов функций, которые инициализируют статические данные (в реализациях, которые я видел при поиске кода Google)

Обработчики сигналовдолжны быть не реентерабельными.Делает ли использование статических данных в методе доступа к SIGRTMIN и SIGRTMAX тем, что эти макросы небезопасны для использования в обработчике сигналов?

1 Ответ

4 голосов
/ 29 декабря 2011

Я не знаю, какую реализацию вы курите, но в libc эти функции в большинстве случаев просто возвращают постоянную статическую переменную.

Вы правы, возможна гонка между двумя вызовами init (), но это просто просто инициализирует static int дважды для одной и той же константы, вряд ли это беспокоит.

И,в то время как статическая переменная на самом деле не такая постоянная, они говорят вам изменять только указанную переменную в начале вашей программы (и я думаю, что только pthread действительно так сильно ее изменяет).

Так что не нужно беспокоиться об этихфункции (из allocrtsig.c glibc 2.14).

И, если вы действительно обеспокоены, просто вызовите SIGRTMIN один раз, прежде чем связывать обработчик сигнала.Это уберет функцию init ().

/* Return number of available real-time signal with highest priority.  */
int __libc_current_sigrtmin (void)
{
#ifdef __SIGRTMIN
  if (!initialized)
    init ();
#endif
  return current_rtmin;
}
libc_hidden_def (__libc_current_sigrtmin)

/* Return number of available real-time signal with lowest priority.  */
int __libc_current_sigrtmax (void)
{
#ifdef __SIGRTMIN
  if (!initialized)
    init ();
#endif
  return current_rtmax;
}
libc_hidden_def (__libc_current_sigrtmax)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...