Трансляция сигнала всем потокам в Linux - PullRequest
3 голосов
/ 05 июля 2011

Я хочу транслировать сигнал из одного потока всем другим потокам в процессе. Потоки, принимающие этот сигнал, должны обрабатывать сигнал в обработчике сигналов. Как мне этого добиться?


Я попробовал следующий код, но он завершается печатью пользовательского сигнала 1. Что происходит?

#include  <stdio.h>
#include  <signal.h>
#include  <sys/types.h>
#include  <pthread.h>

const int NTHREADS = 4;

long  prev_fact, i; 

void  SIGhandler(int);     

void  SIGhandler(int sig)
{
  printf("\nThread %lx Received a SIGUSR1.\n", pthread_self());
}

void* tfunc( void* arg )
{
  printf( "Thread %lx executing...\n", pthread_self() );

  while( 1 )
   ;
}

int main()
{
  int i;
  pthread_t t[NTHREADS];

  for( i = 0; i < NTHREADS; i++ )
   pthread_create( &t[i], NULL, tfunc, NULL );

  for( i = 0; i < NTHREADS; i++ )
   pthread_kill( t[i], SIGUSR1 );

  for( i = 0; i < NTHREADS; ++i) 
   pthread_join(t[i], NULL);

  return 0;
}

Ответы [ 2 ]

4 голосов
/ 05 июля 2011

Портативный способ pthreads позволяет сделать это вокруг всех потоков, выполняя pthread_kill() для каждого. Это требует от вас вести список всех pthread_t значений, представляющих каждый поток в процессе.

В Linux вы можете прочитать /proc/self/task, чтобы определить TID каждого потока в текущем процессе, а затем использовать tgkill() для их сигнализации (используйте результат getpid() в качестве параметра tgid для tgkill() ).

Обратите внимание, что glibc не предоставляет оболочки для tgkill() - вы должны вызывать ее, используя syscall().

1 голос
/ 05 июля 2011

Следующий код работает сейчас ...

#include  <stdio.h>
#include  <signal.h>
#include  <sys/types.h>
#include  <pthread.h>

const int NTHREADS = 4;

void  SIGhandler(int);     

void  SIGhandler(int sig)
{
     printf("\nThread %lx Received a SIGUSR1.\n", pthread_self());
}

void* tfunc( void* arg )
{
  printf( "Thread %d(%lx) executing...\n", *((unsigned int*)arg), pthread_self() );

  while( 1 )
    ;
}

int main()
{
  int i;
  int tid[NTHREADS];
  pthread_t t[NTHREADS];

  signal(SIGUSR1, SIGhandler);

  for( i = 0; i < NTHREADS; i++ )
  {
    tid[i] = i;
    pthread_create( &t[i], NULL, tfunc, tid+i );
  }

  for( i = 0; i < NTHREADS; i++ )
    pthread_kill( t[i], SIGUSR1 );

  for( i = 0; i < NTHREADS; ++i) 
    pthread_join(t[i], NULL);

  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...