向Linux中的所有线程广播信号

时间:2011-07-05 10:34:32

标签: c linux pthreads

我想从一个线程向进程中的所有其他线程广播信号。接收该信号的线程应该处理信号处理程序中的信号。我怎样才能做到这一点?


我尝试了以下代码,但它通过打印用户定义的信号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 个答案:

答案 0 :(得分:4)

可移植的pthreads方法是循环所有线程,为每个线程执行pthread_kill()。这要求您维护代表流程中每个线程的所有pthread_t值的列表。

在Linux上,您可以阅读/proc/self/task以确定当前流程中每个线程的TID,然后使用tgkill()发信号通知它们(使用getpid()的结果作为{{ 1}}参数tgid)。

请注意,glibc不提供tgkill()的包装 - 您必须使用tgkill()调用它。

答案 1 :(得分:0)

以下代码现在可用...

#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;
}