我想从一个线程向进程中的所有其他线程广播信号。 接收该信号的线程应处理信号处理程序中的信号。 我怎样才能做到这一点?
我尝试了下面的代码,但它通过打印用户定义的信号退出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; }
可移植pthreads的方式是循环所有线程,为每个线程执行pthread_kill()
。 这要求您维护表示进程中每个线程的所有pthread_t
值的列表。
在Linux上,您可以读取/proc/self/task
来确定当前进程中每个线程的TID,然后使用tgkill()
来发信号(使用getpid()
的结果作为tgid
参数给tgkill()
)。
请注意,glibc不提供tgkill()
的包装 – 你必须使用syscall()
来syscall()
它。
下面的代码现在可以工作…
#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; }