我想从一个线程向进程中的所有其他线程广播信号。接收该信号的线程应该处理信号处理程序中的信号。我怎样才能做到这一点?
我尝试了以下代码,但它通过打印用户定义的信号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;
}
答案 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;
}