• 概述
  Linux信号机制是在应用软件层次上对中断机制的一种模拟,信号提供了一种处理异步事件的方法,例如,终端用户输入中断键(ctrl+c),则会通过信号机制停止一个程序[1]
  这其实就是向那个程序(进程)发送一个SIGINT信号。每个进程都有一个自己私有的信号处理函数映射表,当该进程成收到一个信号时,对应的信号处理函数被触发执行。而一个进程可以向另外一个进程发送信号,也可以向自己发送信号;操作系统内核也可以向一个进程发送信号,以通知某些硬件事件。信号处理函数映射表中共有64个表项。前32个信号,编号为1 ~ 31,有预定义的含义和处理函数;后32个作为扩充[2]。在终端输入命令“kill -l”就可以看到系统所支持所有的信号。
 
  • 信号机制的两个常用函数

  

    signal

#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);

返回值:若成功则返回信号以前的处理配置,如果出差则返回SIG_ERR;
或者用如下的定义:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t handler);

这个函数的功能是捕捉到相应的信号(signo),并用相应的处理函数(func/handler)来对信号进行相应的相应,是会替代原来的处理函数。但是要和足以,SIGKILL和SIGSTOP这两个信号是既不能被捕捉也不能被忽略的!(当时我们做一个后台程序,我还想用捕捉SIGKILL的方式来免杀呢)。

  KILL

#include<signal.h>
int kill(pid_t pid, int sig);

这个函数的功能是将信号发送给进程或者进程组。

pid > 0  :要发送信号的进程号

pid = 0  :信号被发送到所以和当前进程在同一个进程组的进程

pid = -1 : 信号发送给发送进程有权限向他们发送信号的系统上的所以进程

pid < -1 :信号发送给其进程组ID等于pid的绝对值

  • 几个比较常用的信号

SIGIGN:忽略改信号

SIGDEF:采用系统默认方式处理信号

SIGCHLD:在一个进程终止或者停止时,将该信号发送给其父进程,父进程的wait函数通常用来捕捉这个信号

SIGINT:当用户按中断键(delete/ctrl+c)时将产生这个信号

SIGKILL:此信号可以用于杀死一个进程

SIGSTOP:这是个作业控制信号,用于停止一个进程   这个信号和SIGKILL是仅有的两个不能被捕获或忽略的信号

SYSUSR1/2:用户定义的信号,用于应用程序

  • 程序演示
/*************************************************************************
> File Name: signal.c
> Author: he xingjie
> Mail: gxmshxj@163.com
> Created Time: Fri 25 Oct 2013 07:53:56 AM PDT
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<signal.h> void my_func(int sig_no){
if(sig_no == SIGUSR1)
printf("Receive SIGUSR1.\n");
if(sig_no == SIGUSR2)
printf("Receive SIGUSR2.\n");
if(sig_no == SIGINT)
printf("Receive SIGINT.\n");
} int main(void)
{
if(signal(SIGUSR1, my_func) == SIG_ERR)
printf("can't catch SIGUSR1.\n'");
if(signal(SIGUSR2, my_func) == SIG_ERR)
printf("can't catch SIGUSR2.\n'");
if(signal(SIGINT, my_func) == SIG_ERR)
printf("can't catch SIGINT.\n'"); kill(getpid(),SIGINT); while();
return ;
}

当运行这个程序的时候,我们将会看到:Receive SIGINT.  然后程序不断在循环,如果我们按ctrl+c,将会输出:Receive SIGINT.

如果我们把程序放在后天运行,并且用 kill -USR1 pid。pid为那个进程的id,我们还将会看到Receive SIGUSR1.

  • 参考资料

  [1] UNIX环境高级编程

  [2]  我们老师上课的课件

 

linux中的信号机制的更多相关文章

  1. Linux内核中的信号机制--一个简单的例子【转】

    本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...

  2. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  3. 多线程中的信号机制--signwait()函数【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14237277 在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别, ...

  4. Linux中的保护机制

    Linux中的保护机制 在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了NX.PIE等机制,例如存在NX的话就不能直接执行栈上的数据,存在PIE 的话各个系统调用的地址就是随机化的. 一:ca ...

  5. 25 Linux中的信号

    Linux中的信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通 ...

  6. 浅谈Linux中的信号处理机制(一)

    有好些日子没有写博客了,自己想想还是不要荒废了时间,写点儿东西记录自己的成长还是百利无一害的.今天是9月17号,暑假在某家游戏公司实习了一段时间,做的事情是在Windows上用c++写一些游戏英雄技能 ...

  7. linux中的signal机制(转)

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

  8. Linux下的信号机制

    2017-04-06 之前在看LinuxThreads线程模型的时候,看到该模型是通过信号实现线程间的同步,当时没有多想,直接当做信号量了,现在想起来真是汗颜……后来想想并不是那么回事,于是,就有了今 ...

  9. linux下 signal信号机制的透彻分析与各种实例讲解

    转自:http://blog.sina.com.cn/s/blog_636a55070101vs2d.html 转自:http://blog.csdn.net/tiany524/article/det ...

随机推荐

  1. JavaScript函数使用技巧

    JavaScript中的函数是整个语言中最有趣的一部分,它们强大而且灵活.接下来,我们来讨论JavaScript中函数的一些常用技巧: 一.函数绑定 函数绑定是指创建一个函数,可以在特定的this环境 ...

  2. win10 修改 无线名 无线网络属性 名称 修改

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha win10 修改 管理无线网络 无线网络属性 名称 修改 注册表 修改 ======== ...

  3. BZOJ.4361.isn(DP 树状数组 容斥)

    题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...

  4. [CC-LONCYC]Lonely Cycles

    [CC-LONCYC]Lonely Cycles 题目大意: \(T(T\le1000)\)组数据. 给定一张简单图(不含重边与自环),图中有\(n(n\le2\times10^5)\)个节点和\(m ...

  5. 关于supervisor的入门指北

    关于supervisor的入门指北 在目前这个时间点(2017/07/25),supervisor还是仅支持python2,所以我们要用版本管理pyenv来隔离环境. pyenv 根据官方文档的讲解, ...

  6. SVN解决本地版本控制与服务器版本冲突问题

    最近经常遇到一个冲突问题,svn服务器已经没有这个文件,本地也没有这个文件,但是你提交代码的时候svn会显示冲突,也就是说本地svn仍然在管理着这个文件. 解决办法:在相应的目录下新建一个名字一样的文 ...

  7. java中线程安全的map是ConcurrentHashMap

    原理:http://www.cnblogs.com/ITtangtang/p/3948786.html 与hashtable的区别:  http://blog.csdn.net/songfeihu08 ...

  8. Redis集群官方推荐方案 Redis-Cluster

    Redis-Cluster redis使用中遇到的瓶颈 我们日常在对于redis的使用中,经常会遇到一些问题 1.高可用问题,如何保证redis的持续高可用性. 2.容量问题,单实例redis内存无法 ...

  9. Shiro基础知识03----shiro授权(编程式授权),Permission详解,授权流程(zz)

    授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).  在权限认证中,最核心的是:主体/用户(Subject).权限(Permission).角色(Role).资源 ...

  10. SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)

    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了,利用他可以解决的所有的保边滤波器的能解决的问题,比如细节增强.HD ...