nixp.ru v3.0

20 октября 2017,
пятница,
15:46:31 MSK

DevOps с компанией «Флант»
iliya написал 21 декабря 2004 года в 09:54 (545 просмотров) Ведет себя как мужчина; открыл 13 тем в форуме, оставил 196 комментариев на сайте.

Какие атрибуты надо установить при создание pthread_create, чтоб он мог работать со своими сигналами

чтоб при вызове signal(…,…) он установил свой обработчик ,а не общий для всех.

Uncle Theodore

Имхо, сии вещи суть независимы. Используй стандартные обработчики сигналов внутри нитей, никаких атрибутов не надо. А в чем проблема?

Good Luck,

UT

iliya

Очень просто например если приходит сигнал то он обрабатывается всеми потоками и вызов signal устанавливает обработчик тоже для всех потоков.

Uncle Theodore
iliya
Очень просто например если приходит сигнал то он обрабатывается всеми потоками и вызов signal устанавливает обработчик тоже для всех потоков.

М-м-м-м… Я тут поковырялся, вроде все путем… Смотри:

//sigg.cc
#include 
#include 
#include 
#include 
using namespace std;
void one(int n)
{
  cout << "Got a signal " << n << " so what?\n";
};
void two(int n)
{
  cout << "Oh, my gosh! " << n << endl;
};
void *func1(void *a)
{
  for(;;)
    {
      sleep(1);
      signal(14,one);
    };
  return NULL;
};
void *func2(void *b)
{
  for(;;)
    {
      sleep(1);
      signal(14,two);
    };
  return NULL;
};
int main()
{
  pthread_t thread1, thread2;
  pthread_create(&thread1, NULL, func1, NULL);
  pthread_create(&thread2, NULL, func2, NULL);
  pthread_join(thread1, NULL);
  pthread_join(thread2, NULL);
  return 0;
};

На одном терминале я теперь запускаю sigg

А на другом посылаю killall -14 sigg

Так вот, результат

Oh, my gosh! 14

Got a signal 14 so what?

Oh, my gosh! 14

вполне соотвествует ожиданиям… Если, правда, убрать sleep(1), то сигнал будет три раза захватываться одной и той же нитью, равновероятно какой. Не в этом ли была твоя проблема?

Good Luck,

UT