The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"сигнал только процессу, исключая порождённые потоки "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Процессы, Треды, RPC)
Изначальное сообщение [ Отслеживать ]

"сигнал только процессу, исключая порождённые потоки "  +/
Сообщение от devcoder (ok) on 22-Июн-11, 13:31 
Привет.

Есть процесс который создаёт несколько потоков (pthreads).
И в процессе и в потоках установлены свои sighandler-ы (и маски).
Хочется, чтобы при kill SIGXXX pid (именно kill, не tkill),
SIGXXX получил (прервался) _только процесс_,
исключая доставку того же самого SIGXXX порождённым потокам.

Можно ли?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "сигнал только процессу, исключая порождённые потоки "  +1 +/
Сообщение от wiseman (ok) on 23-Июн-11, 00:38 

> Можно ли?

нет. пруф у Стивенса

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "сигнал только процессу, исключая порождённые потоки "  –1 +/
Сообщение от pavlinux (ok) on 25-Июн-11, 02:02 
>> Можно ли?
> нет. пруф у Стивенса

Стивенс лох..
Хотя не, у меня велосипед Stevens ;-P

Смысел такой - чтоб нить не получила сигнал,
она должна его игнорировать, т.е. обработать

Причёсывать не стал, сами как-нибудь.  


/*
   SIGUSR2, SIGUSR1, SIGHUP - обрабатываются тредами
   SIGINT, SIGBUS, SIGSTOP - из main()
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#include <syslog.h>

enum defines {
    NUMTHREADS = 3,
};

static void *fake_thread(void *arg) {

    sigset_t *set = (sigset_t *) arg;
    int sig = 0;

    syslog(LOG_LOCAL7, "I'm Thread[%lu] waiting for signal....\n", pthread_self());

    for (;;) {
        /* Wait for signal... */
        sigwait(set, &sig);

        switch (sig) {
            case (SIGHUP):
                pthread_exit(NULL);
                break;      
            default:
                syslog(LOG_LOCAL7, "Thread[%d]:Signal[%d]\n", pthread_self(), sig);
                continue;
        }
    }
    return NULL;
}

static void s_handler(int dummy) {
    syslog(LOG_LOCAL7, "I fucked by signal %d\n", dummy);
}

/* Структура передаваемая в нити */
struct st_thread {
    sigset_t set; /* сигнальная пер. */
    char *data;
    int reserved;
} __attribute__((packed)) st_thread;

int main(void) {

    struct st_thread pst_thread[NUMTHREADS];
    pthread_attr_t pattr;
    pthread_t pth[NUMTHREADS];
    int i;

    sigemptyset(&pst_thread->set);
    sigaddset(&pst_thread->set, SIGUSR2);
    sigaddset(&pst_thread->set, SIGUSR1);
    sigaddset(&pst_thread->set, SIGHUP);
    pthread_sigmask(SIG_BLOCK, &pst_thread->set, NULL); // блокируем

    pthread_attr_init(&pattr); // навсякий...    
    pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_DETACHED);

    for (i = 0; i < NUMTHREADS; i++) {
        if (
                pthread_create(&pth[i],
                &pattr, // хрень всяка
                &fake_thread, // функция
                (void *) &pst_thread) // нужности
                != 0)

            syslog(LOG_LOCAL7, "ERROR: pthread_create [%d]", i);
    }

    struct sigaction sact;
    sact.sa_handler = s_handler;
    sigemptyset(&sact.sa_mask);
    sact.sa_flags = 0;

    sigaction(SIGINT, &sact, (struct sigaction *) NULL);
    sigaction(SIGBUS, &sact, (struct sigaction *) NULL);
    sigaction(SIGSTOP, &sact, (struct sigaction *) NULL);

    while (1)
        sleep(10);

    return 0;
}


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "сигнал только процессу, исключая порождённые потоки "  +/
Сообщение от Аноним (??) on 23-Июн-11, 20:00 
> Есть процесс который создаёт несколько потоков (pthreads).
> И в процессе и в потоках установлены свои sighandler-ы (и маски).
> Хочется, чтобы при kill SIGXXX pid (именно kill, не tkill),
> SIGXXX получил (прервался) _только процесс_,
> исключая доставку того же самого SIGXXX порождённым потокам.
> Можно ли?

Нет конечно - вы не поимаете как работают сигналы. Сигнал доставляется потоку.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "сигнал только процессу, исключая порождённые потоки "  +/
Сообщение от devcoder (ok) on 25-Июн-11, 00:02 
> Сигнал доставляется потоку.

man what ?
где почитать, обыскался


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "сигнал только процессу, исключая порождённые потоки "  +/
Сообщение от DeadMustdie email(??) on 27-Июн-11, 10:37 
>> Сигнал доставляется потоку.
> man what ?
> где почитать, обыскался

SUSv3 как IMHO наиболее прямой источник информации. Вот прямая ссылка:
  http://pubs.opengroup.org/onlinepubs/009695399/toc.htm

Для доступа потребуется зарегистрироваться.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "сигнал только процессу, исключая порождённые потоки "  +/
Сообщение от Вова on 27-Июн-11, 12:00 
>>> Сигнал доставляется потоку.
>> man what ?
>> где почитать, обыскался
> SUSv3 как IMHO наиболее прямой источник информации. Вот прямая ссылка:
>   http://pubs.opengroup.org/onlinepubs/009695399/toc.htm
> Для доступа потребуется зарегистрироваться.

Да, ещё примеры кода часто прямо в манах лежат -  man pthread_sigmask и соседние странички, а в sus интересный раздел Rationale.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "сигнал только процессу, исключая порождённые потоки "  +/
Сообщение от Вова on 27-Июн-11, 12:04 
>>>> Сигнал доставляется потоку.
>>> man what ?
>>> где почитать, обыскался
>> SUSv3 как IMHO наиболее прямой источник информации. Вот прямая ссылка:
>>   http://pubs.opengroup.org/onlinepubs/009695399/toc.htm
>> Для доступа потребуется зарегистрироваться.
> Да, ещё примеры кода часто прямо в манах лежат -  man
> pthread_sigmask и соседние странички, а в sus интересный раздел Rationale.

Именно в man pthread_sigmask есть пример кода, который необходим топикстартеру. Все триды игнорируют заданные сигналы, кроме какого-то выделенного под эту задачу; соответственно ничто не мешает этому выделенному прерывать главный поток не через сигнал, а, например, через управляющий сокет/пайп, это если главный поток спит в селекте/полле/итп.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру