Обработка сигналов в потоках

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Обработка сигналов в потоках

Сообщение IMB »

Доброго дня!
Приложение запусткает два потока, в основном потоке и дополнительных регистрируются функции обработки сигналов.
основной поток

Код: Выделить всё

static int prepare_signal(void)
{
    struct sigaction sa;

    memset(&sa, 0, sizeof(sa));

    sa.sa_handler = sig_work;
    sa.sa_flags = SA_RESTART;
    if (sigemptyset(&sa.sa_mask))
        return -1;
    if (sigaddset(&sa.sa_mask, SIGINT))
        return -1;
    if (sigaction(SIGINT, &sa, NULL))
        return -1;

    sa.sa_handler = sig_work;
    sa.sa_flags = SA_RESTART;
    if (sigemptyset(&sa.sa_mask))
        return -1;
    if (sigaddset(&sa.sa_mask, SIGTERM))
        return -1;
    if (sigaction(SIGTERM, &sa, NULL))
        return -1;

    return 0;
}

Завершение дополнительных потоков производится сигналом SIGQUIT.
дополнительные потоки

Код: Выделить всё

static int prepare_signal(void)
{
    struct sigaction sa;

    memset(&sa, 0, sizeof(sa));

    sa.sa_handler = sig_work;
    sa.sa_flags = SA_RESTART;
    if (sigemptyset(&sa.sa_mask))
        return -1;
    if (sigaddset(&sa.sa_mask, SIGQUIT))
        return -1;
    if (sigaction(SIGQUIT, &sa, NULL))
        return -1;
    /*if (pthread_sigmask(SIGQUIT, &sa.sa_mask, NULL))
        return -1;*/

    return 0;
}

Отправка сигнала в поток производится через pthread_kill, пока дополнительный поток был один всё работало, после добавления ещё одного потока регистрация обработчика в потоках проходит нормально, но срабатывает он только в одном из дополнительных потоках.
Вопрос - как правильно регистрировать обработчик сигналов в дополнительных потоках?
Спасибо.
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Обработка сигналов в потоках

Сообщение Red User »

Не используете ли вы sigaction в каждом дополнительном потоке, пытаясь для разных потоков задать разные обработчики?
Обработчик сигнала устанавливается для процесса. При посылке сигнала с помощью pthread_kill обработчик просто будет вызываться в контексте потока, которому послан сигнал.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Обработка сигналов в потоках

Сообщение IMB »

Red User писал(а):
15.06.2013 00:30
Не используете ли вы sigaction в каждом дополнительном потоке, пытаясь для разных потоков задать разные обработчики?

Да, использую.

Если я Вас правильно понял, то мне достаточно в основном потоке описать все необходимые сигналы и в каждом потоке иметь идентичные функции по обработке сигналов?
Не затруднит ли Вас привести пример кода или ссылку на подобный код?
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Обработка сигналов в потоках

Сообщение Red User »

Кода такого у меня нет.
А вообще, может быть лучше использовать для завершения дополнительных потоков pthread_cancel?
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Обработка сигналов в потоках

Сообщение IMB »

pthread_cancel предполагает внезапную остановку потока, а у меня она плановая, например при завершении программы, и перед завершением потока необходимо выполнить ещё некоторые действия
конечно можно навешать обработчиков через pthread_cleanup_push, но на мой взгляд такой код более понятен:

Код: Выделить всё

unsigned char is_stop = 0;

while (!is_stop) {
...
}

pthread_exit((void *)0)

есть ещё вариант с глобальной переменной, в общем есть над чем подумать
Спасибо сказали: