关闭

linux信号处理

标签: linuxsignal终端actionstructprofiling
2078人阅读 评论(0) 收藏 举报
分类:

Linux信号集

1.信号集概念

信号集是一个能表示多个信号的数据类型,sigset_t set ;set即一个信号集。既然是一个集合,就需要对集合进行添加/删除等操作。

int sigemptyset(sigset_t *set); 将set集合置空
int sigfillset(sigset_t *set); 将所有信号加入set集合
int sigaddset(sigset_t *set,int signo); 将signo信号加入到set集合
int sigdelset(sigset_t *set,int signo); 从set集合中移除signo信号
int sigismember(const sigset_t *set,int signo); signo判断信号是否存在于set集合中

代码举例:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>

int main()
{
 sigset_t sigset;
 sigfillset(&sigset);/*填充所有信号*/
 if(sigismember(&sigset,SIGINT))/*判断SIGINT*/
 printf("SIGINT exist in signal_set!\n");
 if(sigismember(&sigset,SIGTERM))
  printf("SIGTERM exist in signal_set!\n");
 if(sigismember(&sigset,SIGABRT))
  printf("SIGABRT exist in signal_set!\n");
 if(sigdelset(&sigset,SIGINT)<0)/*移除SIGINT*/
  perror("del error\n");
 else
  printf("SIGINT have been removed!\n");
 if(sigismember(&sigset,SIGINT))/*再次判断*/
  printf("SIGINT exist in signal_set!\n");
 else
  printf("SIGINT not exist in signal_set!\n");
}

 

输出:

 $ ./sigset
    SIGINT exist in signal_set!
 SIGTERM exist in signal_set!
 SIGABRT exist in signal_set!
 SIGINT have been removed!
 SIGINT not exist in signal_set!

2. 信号集的使用

   定义信号集->设置信号屏蔽位->定义信号处理函数->检测信号
   <1>使用1中的函数即可完成信号集的定义,之后是
   <2>设置信号屏蔽位
   其作用为设置某个进程需要屏蔽的信号

   Int sigprocmask(int how,const sigset_t *set,sigset_t *oset);

  参数

 How 指示如何修改屏蔽信号
 Set是一个非空指针时,根据how修改屏蔽信号
 Oset是一个非空指针时,存放当前屏蔽信号集
 若set为NULL,不改变该进程的信号屏蔽字,how也无意义

 How的取值:

   S I G B L O C K
   该进程新的信号屏蔽字是其当前信号屏蔽字和s e t指向信号集的并集。s e t包含了我们希望阻塞的附加信号

   S I G U N B L O C K
   该进程新的信号屏蔽字是其当前信号屏蔽字和s e t所指向信号集的交集。s e t包含了我们希望解除阻塞的信号

   S I G S E T M A S K
   该进程新的信号屏蔽是s e t指向的值

   举例

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>

/*sigprocmsk的使用*/

void msg(int signo)
{
 if(signo==SIGINT)
  printf("Get SIGINT!\n");
 else
  printf("Get SIGQUIT!\n");
}

int main()
{
 sigset_t sigset,oset;/*sigset存放屏蔽信号,oset保存当前屏蔽信号*/
 sigemptyset(&sigset);/*清空信号集*/
 sigaddset(&sigset,SIGINT);/*添加SIGINT信号,信号集中仅有SIGINT*/
 sigprocmask(SIG_BLOCK,&sigset,&oset);/*加入屏蔽信号*/

 signal(SIGINT,msg);
 signal(SIGQUIT,msg);

 sleep(2);

 raise(SIGINT);/*发送SIGINT信号*/
 raise(SIGQUIT); 

 return 0;
} 

  输出

  Get SIGQUIT!

 <3>定义信号处理函数

  s i g a c t i o n函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了U N I X早期版本使用的s i g n a l函数
  Int sigaction(int signo,const struct sigaction *act,struct sigaction *oact);

  参数:signo 要检测或修改动作的信号量
     Act 非空时,表示要修改的动作
     Oact非空时,返回处理该信号的原先动作

     结构体sigaction如下:

      struct sigaction {
      void (*sa_handler)();/*处理函数或SIG_IGN(忽略)或SIG_DFL(默认)*/
       sigset_t sa_mask; /*处理函数过程中被阻塞*/
     int sa_flags; /*标志位,对信号进程处理选项*/
     } ;

  举例

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>

void msg(int signo)
{
 if(signo==SIGINT)
  printf("Get SIGINT!\n");
}

int main()
{
 sigset_t sigset,oset;/*sigset存放屏蔽信号,oset保存当前屏蔽信号*/
 struct sigaction action1,action2;/*信号处理*/

 action1.sa_handler=msg;
 sigaction(SIGINT,&action1,&action2);

 sleep(2);

 raise(SIGINT);/*发送SIGINT信号*/
 return 0;
} 

  输出:

   Get SIGINT

 <4>检测被搁置信号

  Int sigpending(sigset_t *set);
  返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过s e t参数返回。


原文链接:http://linux.chinaitlab.com/command/857706.html

 

附:linux信号

信号是一种进程间通信的方法,它应用于异步事件的处理。信号的实质是一种软中断,它被发送给一个正在被执行的进程以通知进程有某一特定事件发生了。
一、信号含义

 信号拥有自己特定的名字,均以SIG开始,它们在头文件中被定义为一个正整数,这些正整数被称为信号编号(signal number)。
 以下为各个信号的具体含义:

 1.         SIGHUP:当终端发现断线情况时发送给与控制终端相连的控制进程的信号,或控制进程运行结束时发出的信号。它通常用来通知守护进程重新读取系统配置文件。
 2.         SIGINT:进程中断信号,可以用来中断一个正在运行的进程。通常是从终端输入的中断指令,如Ctrl+C键或Delete键。
 3.         SIGQUIT:用于中断前台进程组中的所有进程的信号。由终端输入的退出指令Ctrl+\所产生。这一信号在终端进程的同时,还将产生一个core文件。
 4.         SIGILL:执行非法硬件指令时产生的错误。
 5.         SIGTRAP:跟踪陷阱信号。
 6.         SIGIOT:I/O错误信号。
 7.         SIGBUS:系统总线错误时产生的信号。
 8.         SIGFPE:浮点运算中发生溢出错误时产生的信号。
 9.         SIGKILL:可用于终止任何一个进程的信号,只能由系统管理员发出,是不可捕捉和被忽略的信号之一。
 10.     SIGUSR1:用于用户自定义的预留信号。可由用户在应用程序中自行定义。
 11.     SIGSEGV:使用非法内存地址所产生的信号。
 12.     SIGUSR2:同SIGUSR1。
 13.     SIGPIPE:当对一个读进程已经运行结束的管道执行写操作时产生的信号。
 14.     SIGALRM:由alarm函数设定的时间段终止时,会产生此信号。
 15.     SIGTERM:调用kill(1)命令时缺省产生的信号。
 16.     SIGCHLD:当一个子进程结束或中断时,用于通知其父进程的信号。必要时,父进程可以通过这一信号来了解子进程的状态变化及结束状态等信息。但在大多数情况下,这一信号将被忽略。
 17.     SIGCONT:是使已被中断的进程继续执行的信号。当此信号为某一特定进程产生后,如果此时该进程并没有被中断,将不会有任何操作发生;但如果该进程是一中断了的进程,即使SIGCONT信号被阻塞或被忽略,此进程也将会继续进行。
 18.     SIGSTOP:中断进程的信号。它是一个作业信号,同时也是不可被捕捉和被忽略的信号之一。
 19.     SIGTSTP:交互式的中断信号。通常是在输入中断键Ctrl+Z时,由终端驱动器所产生。
 20.     SIGTTIN:当一个后台进程需要从终端读取数据时,终端驱动器产生的信号。当读取数据的进程忽略或阻塞这个信号,或者读取数据的进程所在的进程组是孤立进程组时,信号不会产生,并且读操作会发生错误返回,将errno置EIO。
 21.     SIGTTOU:当一个后台进程需要向终端写入数据时,终端驱动器产生的信号。当写入数据的进程忽略或阻塞这个信号,或者写数据的进程所在的进程组是孤立进程组时,信号不会产生,并且写操作会发生错误返回,将errno置EIO。与SIGTTIN不同的是,进程可以选择对控制终端进行后台写。如果后台写不被允许则同SIGTTIN信号一样。
 22.     SIGURG:套接字上出现出现紧急情况时产生的信号。
 23.     SIGXCPU:超出CPU时间限制时产生的信号。
 24.     SIGXFSZ:超出文件大小时产生的信号。
 25.     SIGVTALRM:虚拟定时器报警信号。
 26.     SIGPROF:Profiling定时器报警信号。
 27.     SIGWINCH:终端窗口改变时产生的信号。
 28.     SIGIO:表示某个特定文件描述符上可以进行I/O操作的信号。
 29.     SIGPWR:电源失效信号。
 30.     SIGABRT:调用abort函数时产生的信号,将会使进程非正常结束。
 31.     SIGEMT:实现性定义硬件错误发生时产生的信号。

二、信号的处理

 信号是用于处理异步事件的发生的。在一个进程执行过程中,如果有信号被发送到该进程,则该进程将按预先设定好的处理方法进行相应处理。总体上来讲,当信号发生时,进程所采取的处理方法可以分为两种:

 1.         捕捉信号。当某个信号被发送到一个正在运行的进程时,该进程及对此特定信号注册相应的信号处理函数,以完成所需处理。也就是说,在编写程序代码时,对需要进行捕捉处理的信号给出相应的处理程序代码。一旦接收到此信号,则通知系统调用相应信号处理函数做出处理。对应于每一个信号,系统中都有相应的缺省处理函数(通常为终止进程)。可以设定进程在信号发生时使用缺省处理函数进行处理。
 2.         忽略信号。当不希望接收到的信号对进程的执行产生影响,而让进程继续进行时,可以忽略该信号。进程将继续进行而不对信号进行任何处理。


原文链接:http://hi.baidu.com/xiboliya/blog/item/f60153ee5a5fa8f3b2fb95b6.html

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Linux信号处理机制原理

在之前的文章信号入门详解中,我们已经了解了信号的基础知识,下来给大家介绍Linux信号处理机制的实现原理 一、信号机制 在Linux中,信号是进程间通讯的一种方式,...
  • lisongjia123
  • lisongjia123
  • 2016-01-06 21:42
  • 2601

Linux信号机制分析和信号处理函数

【摘要】本文分析了Linux内核对于信号的实现机制和应用层的相关处理。首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理。接着分析了内核对于信号的处理流程包括信号的触发/注册/执...
  • zhangchaoq
  • zhangchaoq
  • 2016-04-20 16:57
  • 1898

linux signal信号处理过程与机制--完全实例讲解

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。  信号机制是进程之间相互传递消息的一种方法...
  • lee244868149
  • lee244868149
  • 2014-08-20 17:08
  • 2523

Java 工具(jmap,jstack)在linux上的源码分析(二)信号处理

当java虚拟机启动的时候,会启动很多内部的线程,这些线程主要在thread.cpp里的create_vm方法体里实现 而在thread.cpp里主要起了2个线程来处理信号相关的 JvmtiE...
  • raintungli
  • raintungli
  • 2011-12-02 17:00
  • 5836

Linux环境编程之信号处理(二、kill()函数)

前一篇有关信号的blog Linux中信号处理(一)中已经大概的分析了信号基本处理方法,已经signal的解析和绑定处理函数;这一篇blog来复习下信号中常用到的几个函数; kil...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015-04-02 14:32
  • 2022

linux被信号处理函数中断的系统调用和库函数是否会自动重启

如果在系统调用或者库函数被阻塞的时候调用了信号处理函数,那么库函数和系统调用将会表现两种情况中的一种:         1、在信号处理函数返回的时候自动重启。      ...
  • eagle51
  • eagle51
  • 2016-11-18 09:27
  • 683

Linux C编程--进程间通信(IPC)2--信号处理函数

本文将对两个信号处理函数进行介绍 1.signal 2.sigaction 1.signal signal(设置信号处理方式) 相关函数  sigaction,kill,rai...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013-03-04 19:59
  • 2222

Linux TCP 服务器编程(三):信号处理

【版权声明:转载请保留出处:blog.csdn.net/gentleliu。邮箱:shallnew*163.com】 上一节说到我们不愿意留存僵死进程,它会占用内核空间,最终可能导致资源耗尽。所...
  • gentleliu
  • gentleliu
  • 2014-01-01 18:11
  • 1494

linux 信号处理流程

对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个阶段: 信号诞生信号在进程中注册信号在进程中的注销信号处理函数执行 1    信号诞生     信号...
  • my_aoong
  • my_aoong
  • 2015-12-05 00:48
  • 577

Linux Signal及Golang中的信号处理

http://colobu.com/2015/10/09/Linux-Signals/ 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的...
  • leonpengweicn
  • leonpengweicn
  • 2016-08-05 17:43
  • 1890
    个人资料
    • 访问:1872224次
    • 积分:19435
    • 等级:
    • 排名:第519名
    • 原创:308篇
    • 转载:83篇
    • 译文:20篇
    • 评论:282条
    学习交流
    Email: moxiaomomo@gmail.com
    QQ:    809444138
    博客专栏
    最新评论