Posted on 2009-08-05 15:15
Prayer 阅读(269)
评论(0) 编辑 收藏 引用 所属分类:
LINUX/UNIX/AIX
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#define THREAD_NUM 3
pthread_t threadBuf[THREAD_NUM];
int tcBuf[THREAD_NUM];
void* threadOpr1(void* arg);
void* threadOpr2(void* arg);
void sigTermHandler(void);
/**********************************
试验一个线程杀死其他的线程
但是进程不退出
***********************************/
int main(){
int i=0;
pthread_t killer;
/*signal(SIGCLD, SIG_IGN);*/
for(i = 0; i < THREAD_NUM; i++){
tcBuf[i] = i + 1;
if( (pthread_create(&threadBuf[i], NULL,threadOpr1,
&tcBuf[i])) != 0 ) {
printf("pthread_create \n");
return -1;
}
}
sleep(5);
if( (pthread_create(&killer, NULL,threadOpr2,
NULL)) != 0 ) {
printf("pthread_create \n");
return -1;
}
sleep(30);
printf("main exit\n");
return 0;
}
/**********************************
被杀死的线程函数
***********************************/
void* threadOpr1(void* arg){
int tcId=*(int *)arg;
int i=0;
signal(SIGTERM,(void (*)( ))sigTermHandler);
while(i<10){
printf("ID%d --%d live\n",tcId,pthread_self());
i++;
sleep(2);
}
printf("killed exit\n");
pthread_exit(NULL);
}
/**********************************
杀死其他线程的线程
***********************************/
void* threadOpr2(void* arg){
int i=0;
for(i = 0; i < THREAD_NUM; i++){
printf("%d \n",i);
if( (pthread_kill(threadBuf[i],SIGTERM)) != 0 ) {
printf("pthread_kill \n");
pthread_exit(NULL);
}
sleep(2);
}
sleep(30);
printf("killer exit \n");
pthread_exit(NULL);
}
/**********************************
信号处理函数
***********************************/
void sigTermHandler(void)
{
/*早期版本,每次信号处理完之后,随即将信号动作复置为默认值*/
printf("sigal exit %d\n",pthread_self());
signal(SIGTERM,(void (*)( ))sigTermHandler);
pthread_exit(NULL);
}
结果:
ID3 --772 live
ID1 --258 live
ID2 --515 live
ID3 --772 live
ID1 --258 live
ID2 --515 live
ID3 --772 live
ID1 --258 live
ID2 --515 live
0
sigal exit 258
ID3 --772 live
ID2 --515 live
1
sigal exit 515
ID3 --772 live
2
sigal exit 772
main exit