C多线程编程信号处理

用linux C编程的时候,处理信号在所难免。在多线程编程中需要注意两个函数的使用,一个是pthread_sigmask(), 用来在线程中屏蔽某个信号;另一个是sigaction(),在线程中用来设置信号的处理方式。

void sig_handler1(int arg)
{
  printf("thread1 get signal\n");
  return;
}
void sig_handler2(int arg)
{
  printf("thread2 get signal\n");
  return;
}

void *thread_fun1(void *arg)
{
  printf("new thread 1\n");

  struct sigaction act;
  memset(&act, 0, sizeof(act));
  sigaddset(&act.sa_mask, SIGQUIT);
  act.sa_handler = sig_handler1;
  sigaction(SIGQUIT, &act, NULL);

  pthread_sigmask(SIG_BLOCK, &act.sa_mask, NULL);
  sleep(2);
}

void *thread_fun2(void *arg)
{
  printf("new thread 2\n");

  struct sigaction act;
  memset(&act, 0, sizeof(act));
  sigaddset(&act.sa_mask, SIGQUIT);
  act.sa_handler = sig_handler2;
  sigaction(SIGQUIT, &act, NULL);

  // pthread_sigmask(SIG_BLOCK, &act.sa_mask, NULL);
  sleep(2);
}

int main()
{
  pthread_t tid1, tid2;
  int err;
  int s;

  err = pthread_create(&tid1, NULL, thread_fun1, NULL);
  if(err != 0)
  {
    printf("create new thread 1 failed\n");
    return;
  }
  err = pthread_create(&tid2, NULL, thread_fun2, NULL);
  if(err != 0)
  {
    printf("create new thread 2 failed\n");
    return;
  }

  sleep(1);

  s = pthread_kill(tid1, SIGQUIT);
  if(s != 0)
  {
    printf("send signal to thread1 failed\n");
  }
  s = pthread_kill(tid2, SIGQUIT);
  if(s != 0)
  {
    printf("send signal to thread2 failed\n");
  }

  pthread_join(tid1, NULL);
  pthread_join(tid2, NULL);

  return 0;
  }

结果将会是:

new thread 2

new thread 1

thread1 get signal

或者:

new thread 1

new thread 2

thread2 get signal

会发现sig_handler打印的内容以最后注册的处理函数为准,意思是说线程1和线程2,在线程1中屏蔽SIGQUIT,而线程2中没有,按理来说不管运行多少遍最后处理函数打印出的内容都应该是thread2 get signal。但结果不是这样,为什么??

其实对某个信号处理函数,以程序执行时最后一次注册的处理函数为准,如果线程1最后执行,则以线程1注册的处理函数为准,最后线程2中处理函数替换为了线程1的。即在所有的线程里,同一个信号在任何线程里对该信号的处理一定相同 。

时间: 2024-08-03 17:04:05

C多线程编程信号处理的相关文章

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage). 一

Linux系统编程@多线程编程

多线程编程 操作系统原理概念 时间片 进程状态 上下文: 对进程来说,就是进程的执行环境,具体就是各个变量和数据,包括所有的寄存器变量.打开的文件.内存信息等. 进程的写时复制:由于一般 fork后面都接着exec,所以,现在的 fork都在用写时复制的技术,顾名思意,就是,数据段,堆,栈,一开始并不复制,由父,子进程共享,并将这些内存设置为只读.直到父,子进程一方尝试写这些区域,则内核才为需要修改的那片内存拷贝副本.这样做可以提高 fork的效率. 线程函数的可重入性:所谓“重入”,常见的情况

为什么对多线程编程这么怕?pthread,sem,mutex,process

转自http://blog.chinaunix.net/uid-20788636-id-1841334.html 1.线程创建和退出创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create.在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了,这也是线程退出一种方法.另一种退出线程的方法是使用函数pthread_exit,这是线程的主动行为.在线程中使用pthread_exit来代替进程中的exit.由于一个进程中的多个线程是共享数

Linux多线程编程小结

 Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序设计第3版>. 1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(由于线程有自己的局部变量),但与它的创建者共享全局变量.文件描写叙述符.信号句柄和当前文件夹状态. Linux通过fork创建子进程与创建线程之间是有差别的:fork创建出该进程的一份拷贝,这个新进程拥有自己的

Linux高性能服务器编程——多线程编程(下)

多线程编程 条件变量 如果说互斥锁是用于同步线程对共享数据的访问的话,那么条件变量则是用于线程之间同步共享数据的值.条件变量提供了一种线程间的通信机制:当某个共享数据达到某个值得时候,唤醒等待这个共享数据的线程. 条件本身是由互斥量保护的.线程在改变条件状态前必须首先锁住互斥量,其他现成在获得互斥量之前不会察觉到这种变化,因为必须锁住互斥量以后才能计算条件. 条件变量的相关函数主要有如下5个: #include <pthread.h> int pthread_cond_destroy(pthr

Linux多线程编程和Linux 2.6下的NPTL

Linux多线程编程和Linux 2.6下的NPTL 在Linux 上,从内核角度而言,基本没有什么线程和进程的区别--大家都是进程.一个进程的多个线程只是多个特殊的进程他们虽然有各自的进程描述结构,却共享了同一 个代码上下文.在Linux上,这样的进程称为轻量级进程Light weight process.致此,就是关于线程的总体概念了,我们往往就在了解这个概念的情况下开始我们的多线程编程之旅.这对于多线程编程入门已经足够了,然而事 实上线程却要复杂的多. 首先多线程间的优先级调度,内存资源(

Linux多线程编程详解 [By: HarryAlex]

本文内容主要参考于<Linux程序设计·第3版>.<Linux环境C程序设计>.<C语言核心技术>.<深入理解计算机系统·第2版>,代码运行环境: Linux version 3.10.0-123.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Thu Jun 4 17:17:49 CST 2015 1. Linux进程与

多线程编程核心技术总结(读周志明书籍的总结)

多线程编程核心技术总结 1.Java多线程基本技能 1.1进程和线程的概念: 进程是独立的程序,线程是在进程中独立运行的子任务. 1.2使用多线程 1.2.1实现方法:继承Thread类,重写Runnable接口. 1.2.2线程安全问题:并发修改公共的实例变量,i++,i-- 1.3线程Thread类的一些方法: currentThread() 放回代码段正在被那个线程调用 isAlive() 判断线程是否处于活动状态 sleep() 使得当前线程退出CPU片段,等待获取锁 1.4停止线程 1