pkill 可以单独向某一个线程发信号:
两个线程都注册了SIGUSR1信号,但只有线程tid1收到该信号
1 #include "apue.h" 2 #include <pthread.h> 3 4 #define LOGI(format,...) printf("function: %s",format,__FUNCTION__, __VA_ARGS__) 5 6 void sig_handle(int signo) 7 { 8 printf("%s:tid: (0x%lx) signo:%d ",__FUNCTION__, (unsigned long)pthread_self(),signo); 9 pthread_exit((void*)3); 10 } 11 void * 12 thr_fn1(void *arg) 13 { 14 signal(SIGUSR1,sig_handle); 15 pid_t pid; 16 pthread_t tid; 17 18 pid = getpid(); 19 tid = pthread_self(); 20 21 printf("thread 1 start "); 22 printf("pid %lu tid %lu (0x%lx) ", (unsigned long)pid, 23 (unsigned long)tid, (unsigned long)tid); 24 while(1); 25 printf("thread 1 end "); 26 return((void *)1); 27 } 28 29 void sig_handle2(int signo) 30 { 31 printf("%s: tid: (0x%lx) signo:%d ", __FUNCTION__, (unsigned long)pthread_self(),signo); 32 pthread_exit((void*)20); 33 } 34 35 void * 36 thr_fn2(void *arg) 37 { 38 signal(SIGUSR1,sig_handle2); 39 pid_t pid; 40 pthread_t tid; 41 42 pid = getpid(); 43 tid = pthread_self(); 44 printf("thread 2 start "); 45 printf("pid %lu tid %lu (0x%lx) ", (unsigned long)pid, 46 (unsigned long)tid, (unsigned long)tid); 47 sleep(12); 48 printf("thread 2 end "); 49 pthread_exit((void *)2); 50 } 51 52 int 53 main(void) 54 { 55 int err; 56 pthread_t tid1, tid2; 57 void *tret; 58 59 err = pthread_create(&tid1, NULL, thr_fn1, NULL); 60 if (err != 0) 61 err_exit(err, "can't create thread 1"); 62 err = pthread_create(&tid2, NULL, thr_fn2, NULL); 63 if (err != 0) 64 err_exit(err, "can't create thread 2"); 65 66 sleep(2); 67 68 pthread_kill(tid1,SIGUSR1); 69 70 err = pthread_join(tid1, &tret); 71 if (err != 0) 72 err_exit(err, "can't join with thread 2"); 73 printf("thread 1 exit code %ld ", (long)tret); 74 75 err = pthread_join(tid2, &tret); 76 if (err != 0) 77 err_exit(err, "can't join with thread 1"); 78 printf("thread 2 exit code %ld ", (long)tret); 79 80 81 exit(0); 82 }
运行结果:
w00367381@ubuntu:~/apue.3e/threads$ ./exitstatus thread 2 start pid 3651 tid 140564637652736 (0x7fd7c14b9700) thread 1 start pid 3651 tid 140564646045440 (0x7fd7c1cba700) sig_handle:tid: (0x7fd7c1cba700) signo:10 thread 1 exit code 3 thread 2 end thread 2 exit code 2