powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_sigmask обработка сигналов из других потоков.
9 сообщений из 9, страница 1 из 1
pthread_sigmask обработка сигналов из других потоков.
    #38111475
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день пишу небольшой сервер, передаю файл с помошью 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
pthread_sigmask обработка сигналов из других потоков.
    #38111490
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987,

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

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

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

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

Попробуй ловить SIGPIPE сигнал в потоке который делает sendfile. Сигнал синхронный, поставь обработчик на него в потоке.Пробовал ноль реакции.
...
Рейтинг: 0 / 0
pthread_sigmask обработка сигналов из других потоков.
    #38112073
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
pthread_sigmask обработка сигналов из других потоков.
    #38113013
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
pthread_sigmask обработка сигналов из других потоков.
    #38113383
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / pthread_sigmask обработка сигналов из других потоков.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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