Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_sigmask обработка сигналов из других потоков. / 9 сообщений из 9, страница 1 из 1
15.01.2013, 21:36
    #38111475
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
Добрый день пишу небольшой сервер, передаю файл с помошью sendfile функции, в классе сервервера есть пул трейдов вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
class server
          : private boost::noncopyable
        {
          multi_threading::thread_pool<multi_threading::pthread_thread_pool_impl<std::function<void()>,multi_threading::detail::pthread_sign_type_handler<SIGPIPE> >  > pool_connections_;
        };
    template<size_t... sign>
        struct pthread_sign_type
        {
            pthread_sign_type()
            {
                sigemptyset (&signal_mask);
                common::mpl::utils::repiter{(sigaddset(&signal_mask,sign),1)...};
                pthread_sigmask(SIG_SETMASK, &signal_mask, &old_mask);
            }
            sigset_t signal_mask;
            sigset_t old_mask;
        };
        template<size_t... sign>
        struct pthread_sign_handler_type : pthread_sign_type<sign...>
        {
            typedef pthread_sign_type<sign...> base_class;
            typedef pthread_sign_handler_type<sign...> class_type;
            pthread_sign_handler_type()
            {
                pthread_create(&thread,NULL,class_type::signal_thread, (void*)this);
            }
         private:
            static void *signal_thread (void *arg)
            {
                class_type *th = reinterpret_cast<class_type*>(arg);
                int       sig_caught;
                int       rc;
                while(1)
                {
                    rc = sigwait (&th->signal_mask, &sig_caught);
                    //сюда никогда не попадаю хотя очень хочется
                }
            }
            pthread_t thread;
        };
template<typename task_t,class pthread_sign_t = detail::empty >
    class pthread_thread_pool_impl: pthread_sign_t
    {
    public:
        typedef task_t task_type;
        typedef void (*signal_handler_func_type)(void *);
        pthread_thread_pool_impl(size_t threads): stop_(false)
        {
            pthread_attr_init(&attr);
            pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
            init_work(threads);
        }
        static void *thread_func(void *d)   { ((pthread_thread_pool_impl *)d)->run_work(); }
        ~pthread_thread_pool_impl()
        {
        }
    private:
        void init_work(size_t threads)
        {
            workers.clear();
            tasks.clear();
            for(size_t i = 0;i<threads;++i)
            {
                pthread_t thread;
                pthread_create(&thread, &attr,pthread_thread_pool_impl::thread_func, (void*)this);
                workers.push_back(thread);
            }
        }
        void run_work()
        {
              task_type task;
              while(true)
              {
              }
              pthread_exit(NULL);
        }
        pthread_attr_t attr;
        std::vector<pthread_t> workers;
    };


Во время работы при вызове sendfile получаю SIGPIPE, для этого была и добавлена маска сигналов(как я понимаю маска сигналов наследуется и поэтому все они просто блокируют SIGPIPE) но хочется чтоб прошли дальше функции sigwait. Что надо сделать?
...
Рейтинг: 0 / 0
15.01.2013, 21:54
    #38111490
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
Katamaran1987,

Нафик вам обрабатывать SIGPIPE? Это ж каменный век.
Заигнорьте его при старте каждого потока, и вместо него обрабатывайте ошибки напосредственно при записи в конкретный сокет.
Код: plaintext
1.
signal(SIGPIPE, SIG_IGN);
...
Рейтинг: 0 / 0
15.01.2013, 21:57
    #38111492
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
Можно еще для конкретных сокетов игнорить через SO_NOSIGPIPE.
Это если вы не контролируете старт потоков.
...
Рейтинг: 0 / 0
16.01.2013, 10:04
    #38111704
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
Anatoly MoskovskyKatamaran1987,

Нафик вам обрабатывать SIGPIPE? Это ж каменный век.
Заигнорьте его при старте каждого потока, и вместо него обрабатывайте ошибки напосредственно при записи в конкретный сокет.
Код: plaintext
1.
signal(SIGPIPE, SIG_IGN);

Я контролирую старт потоков, но вызов в теле потока функции signal(SIGPIPE, SIG_IGN); никчему не приводит, единственное решение которое я нашел является вводить маску,обработать SIGPIPE мне хочется ради интереса, потому что вот это
Anatoly Moskovskyошибки напосредственно при записи в конкретный сокет.
можно сделать всегда,это легкий путь.
...
Рейтинг: 0 / 0
16.01.2013, 12:35
    #38111963
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
Katamaran1987,

Попробуй ловить SIGPIPE сигнал в потоке который делает sendfile. Сигнал синхронный, поставь обработчик на него в потоке.
...
Рейтинг: 0 / 0
16.01.2013, 13:16
    #38112065
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
OoCcKatamaran1987,

Попробуй ловить SIGPIPE сигнал в потоке который делает sendfile. Сигнал синхронный, поставь обработчик на него в потоке.Пробовал ноль реакции.
...
Рейтинг: 0 / 0
16.01.2013, 13:19
    #38112073
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
OoCcKatamaran1987,

Попробуй ловить SIGPIPE сигнал в потоке который делает sendfile. Сигнал синхронный, поставь обработчик на него в потоке. Вы имеете ввиду
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void run_work()
        {
signal(SIGPIPE, handler_func);
              task_type task;
              while(true)
              {
              }
              pthread_exit(NULL);
        }

?
...
Рейтинг: 0 / 0
16.01.2013, 21:52
    #38113013
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
Katamaran1987OoCcKatamaran1987,

Попробуй ловить SIGPIPE сигнал в потоке который делает sendfile. Сигнал синхронный, поставь обработчик на него в потоке. Вы имеете ввиду
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void run_work()
        {
signal(SIGPIPE, handler_func);
              task_type task;
              while(true)
              {
              }
              pthread_exit(NULL);
        }

?

Да, это. В правильных системах SIGPIPE приходит в тот же поток если там есть обработчик. Но не в линуксе. Кроме того в линуксе он не становится в ожидание (pending). Поэтому и sigwait не срабатывает.

Как тебе уже советовал Anatoly - будь как все.
...
Рейтинг: 0 / 0
17.01.2013, 10:16
    #38113383
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pthread_sigmask обработка сигналов из других потоков.
OoCcKatamaran1987пропущено...
Вы имеете ввиду
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void run_work()
        {
signal(SIGPIPE, handler_func);
              task_type task;
              while(true)
              {
              }
              pthread_exit(NULL);
        }

?

Да, это. В правильных системах SIGPIPE приходит в тот же поток если там есть обработчик. Но не в линуксе. Кроме того в линуксе он не становится в ожидание (pending). Поэтому и sigwait не срабатывает.

Как тебе уже советовал Anatoly - будь как все.Благодарю, за понятный ответ, тему можно закрывать.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_sigmask обработка сигналов из других потоков. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]