Программирование Unix - обработчик сигналов - PullRequest
1 голос
/ 23 ноября 2011

Я столкнулся с некоторыми проблемами при попытке написать небольшую оболочку на языке c.

Проблема заключается в следующем: Предположим, я написал некоторый код для обработчика сигналов, который в этом случае модифицирован для перехвата SIGCHLD сигналов. Как я могу уведомить свою программу о том, что сигнал был перехвачен?
Проблема проста, если бы я использовал глобальную переменную , но на самом деле я не хочу этого делать. Так что любые предложения / советы будут высоко оценены!

Вот как я решаю это прямо сейчас.

volatile sig_atomic_t exit_status; /* <--global variabel */

void sigchld_handler(int signal) {
    switch (signal) {
    case SIGCHLD:
        exit_status = 1; /* SIGCHLD was caught, notify program.. */
        break;
    default:
        fprintf(stderr, "Some signal catched\n"); /* not a signal of intrest */
        break;
    }
}

// Спасибо

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Стандартным решением является использование самокрутки Unix . Преимущество заключается в том, что конец чтения канала может использоваться с select() или epoll(), что обеспечивает прекрасную интеграцию с циклами событий без необходимости периодически опрашивать значение атомарной переменной.

1 голос
/ 23 ноября 2011

Если честно, для меня это выглядит как идеальный случай для глобальной переменной.Но если вы не хотите этого делать, есть много альтернатив: http://beej.us/guide/bgipc/output/html/multipage/index.html Выберите один из списка, который лучше всего подходит для вашей архитектуры.

1 голос
/ 23 ноября 2011

signal(7) содержит список функций, которые безопасно выполнять в обработчиках сигналов;fprintf(3) не один из них.Что произойдет, если ребенок умирает, когда ваша оболочка печатает подсказку или сообщения о состоянии?Поврежденные структуры данных - это обычный результат.(Это хорошо для игрушек - но я бы не хотел этого в оболочке.)

Установка глобальных переменных довольно типична для обработчиков сигналов.Это простой способ сообщить основному циклу событий или главному циклу обработки, что нужно что-то еще сделать.

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