二 Pthread 并发编程( 四 )


线程的线程号在 pthread 当中的一个线程对应一个内核的线程 , 内核和 pthread 都给线程维护了一个线程的 id 号 , 我们可以使用 gettid 获取操作系统给我们维护的线程号 , 使用函数 pthread_self 得到 pthread 线程库给我们维护的线程号!
#define _GNU_SOURCE#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <sys/types.h>void* func(void* arg) {  printf("pthread id = %ld tid = %d\n", pthread_self(), (int)gettid());  return NULL;}int main() {  pthread_t t;  pthread_create(&t, NULL, func, NULL);  pthread_join(t, NULL);  return 0;}【二 Pthread 并发编程】上面的程序的输出结果如下:
pthread id = 140063790135040 tid = 161643线程与信号在 pthread 库当中主要给我们提供了一些函数用于信号处理 , 我们在 pthread 库当中可以通过函数 pthread_kill 给其他的进程发送信号 。
 1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL  5) SIGTRAP 6) SIGABRT  7) SIGBUS  8) SIGFPE  9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX我们可以在一个线程当中响应其他线程发送过来的信号 , 并且响应信号处理函数 , 在使用具体的例子深入了解线程的信号机制之前 , 首先我们需要了解到的是在 pthread 多线程的程序当中所有线程是共享信号处理函数的 , 如果在一个线程当中修改了信号处理函数 , 这个结果是会影响其他线程的 。
#define _GNU_SOURCE#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <signal.h>#include <string.h>void sig(int signo) {  char s[1024];  sprintf(s, "signo = %d tid = %d pthread tid = %ld\n", signo, gettid(), pthread_self());  write(STDOUT_FILENO, s, strlen(s));}void* func(void* arg) {  printf("pthread tid = %ld\n", pthread_self());  for(;;);  return NULL;}int main() {  signal(SIGHUP, sig);  signal(SIGTERM, sig);  signal(SIGSEGV, sig);  pthread_t t;  pthread_create(&t, NULL, func, NULL);  sleep(1);  pthread_kill(t, SIGHUP);  sleep(1);  return 0;}上面的程序的输出结果如下所示:
pthread tid = 140571386894080signo = 1 tid = 7785 pthread tid = 140571386894080在上面的程序当中 , 我们首先在主函数里面重新定义了几个信号的处理函数 , 将 SIGHUP、SIGTERM 和 SIGSEGV 信号的处理函数全部声明为函数 sig  , 进程当中的线程接受到这个信号的时候就会调用对应的处理函数 , 在上面的程序当中主线程会给线程 t 发送一个 SIGHUP 信号 , 根据前面信号和数据对应关系我们可以知道 SIGHUP 对应的信号的数字等于 1  , 我们在信号处理函数当中确实得到了这个信号 。

经验总结扩展阅读