在线程中也可以使用Linux的信号机制,此处简要介绍Linux线程信号管理函数。
1、pthread_kill 函数
pthread_kill函数用来在线程发送信号。
1
|
extern
int pthread_kill (pthread_t __threadid,
int signo) __THROW;
|
如果signo为0,就会进行错误检查而不发送信号。成功完成后,pthread_kill()将返回0。就会进行错误编号,用于指明错误。
2、pthread_sigmask函数
pthread_sigmask函数用来检查(或者更改)调用线程的信号掩码,pthread_sigmask()函数声明如下:
1
2 |
extern
int pthread_sigmask (
int __how, __const __sigset_t *__restrict __newmask,
__sigset_t *__restrict __oldmask) __THROW; |
1、SIG_BLOCK。所得的集合是当前集合与参数oldmask 指向的信号集的并集。
2、SIG_UNBLOCK。所得的集合是当前集合与参数oldmask指向的信号机的补集的交集。
3、SIG_SETMASK。所得到的集合是参数oldmask指向的信号集。
第二个参数newmask指向信号集的指针,将用于更改当前阻塞的信号集。
第三个参数oldmask是指向前一个信号掩码将返回的位置指针。
1、如果参数oldmask不是空指针,则前面的信号掩码将返回oldmask。
2、如果newmask是空指针,则参数how的值无关紧要,线程的信号掩码不会更改,因此,可以通过调用来查询当前阻塞的信号。
如果调用pthread_sigmask()后有未决的非阻塞信号,则在对pthread_sigmask()的调用返回之前,至少传送其中一个信号。
需要注意的是,要阻塞SIGKILL或者SIGSTOP信号是不可能的。这是系统强制执行的,而不会导致指明错误。成功完成后,pthread_sigmask()返回0。否则,返回错误编号来指明错误。如果由于某种原因pthread_sigmask()失败,线程的信号掩码将不会变化。
3、代码实例
下面是一个使用线程信号的简单实例,在此程序中,主线程向子线程发送了一个KILL信号,以使子线程结束。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <iostream>
using namespace std; #include<stdio.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h> #include<signal.h> void *test_program( void *arg); int main( int argc, char *argv[]) { int i; pthread_t threadid; void *status; if(pthread_create(&threadid, NULL, test_program, NULL) > 0) { fprintf(stderr, "pthread_create failure\n"); exit(EXIT_FAILURE); } sleep( 5); printf( "this is parent,send kill signal to thread %d\n", threadid); if(pthread_kill(threadid, SIGKILL) != 0) { perror( "pthread_kill"); exit(EXIT_FAILURE); } return 0; } void *test_program( void *arg) { int i; for(i = 0;; i++) { sleep( 1); printf( "this is child thread ,%d\n", i); printf( "wait for kill signal\n"); } exit(EXIT_SUCCESS); } |