1.信号本质

1)信号是一种软件中断,是在软件层次上对中断的模拟;

2)、在日常生活中也有很多信号,比如常见的红绿灯信号,我们看见红灯就停下,linux中的信号也是类似的,它提供一种机制告诉某个进程在某个时刻该怎样做

2.信号产生(来源)

1)硬件来源:比如我们按下了键盘或者其它硬件故障;

2)软件来源:一些系统函数,最常见的发送信号的函数有kill, raise, alarm和pause;

3.信号递送

  当导致产生信号的事件发生时,内核就产生一个信号。信号产生后,内核通常会在进程表中对进程设置某种形式的标志,当内核设置了这个标志,我们就说内核向一个进程递送了一个信号

4.信号未决

  信号产生和递送之间的时间间隔称为信号未决

5.进程对信号的处理方式(也称对信号的动作)

1)忽略此信号:用signal函数指定SIG_IGN;SIGKILL和SIGSTOP不能被忽略

2)捕捉此信号:用signal函数指定一个捕捉函数,指定信号被捕捉到就会调用这个捕捉函数;SIGKILL和SIGSTOP不能被捕捉

3)执行系统默认动作:用signal函数指定SIG_DFL

6.signal函数

作用:设置进程对信号的处理方式(动作)

  1. void handler(int signo)
  2. {
  3. //捕捉函数
  4. }
  5.  
  6. signal(SIGINT,SIG_IGN);
  7. signal(SIGINT,SIG_DFL);
  8. signal(SIGINT,process);

7.sigaction函数

作用:查看设置进程对信号的处理方式(动作),比signal()函数多了查看,sigaction函数能传递信息给捕捉函数,signal函数则不能。目前linux中的signal()是通过sigaction()函数实现的。

8.信号排队

  每个进程有一个信号屏蔽字,规定了当前要阻塞递送到该进程的信号集(unix提供sigprocmask函数可以获得和更改屏蔽字),对于被阻塞的信号,如果进程对该信号的动作是捕捉或系统默认(即不是忽略),则内核将为该信号保持为未决状态,直到该信号解除阻塞或将对该信号的动作更改为忽略。在这之前,如果这种信号发生了多次,则发生未决信号排队

9.不可靠信号

早期unix系统的信号为不可靠信号,它们有下面两点特性(问题):

1)进程对某种信号的处理方式进行设置后(早期的signal函数),第一次接收到这种信号,进程按所设置的方式处理,在这之后,这种信号的处理方式就会被自动重置为系统默认值

所以当信号的处理方式设成捕捉时,一般会在捕捉函数的开头进行信号处理方式的重建

  1. int sig_int();//捕捉函数
  2. .
  3. .
  4. .
  5. signal(SIGINT, sig_int);//设置信号处理方式
  6. .
  7. .
  8. .
  9. sig_int()
  10. {
  11. signal(SIGINT, sig_int);//信号处理方式的重建
  12. .
  13. .
  14. }

但是这种方法也有问题:捕捉到SIGINT,第5行执行,转到第9行调用sig_int(),再进入函数执行第11行,在执行完第5行后到执行第11行前的这段时间里,对SIGINT的处理方式是系统默认值,如果这时发生了SIGINT中断,则程序就终止了。

2)信号可能丢失:对于阻塞信号,不发生未决信号排队,信号阻塞解除后,仅传送该种信号一次,后来的该种信号都将丢失

9.1Linux下的不可靠信号

1)Linux对不可靠信号机制做了改进:信号的处理方式不会被自动重置为系统默认值。因此,Linux下的不可靠信号问题主要指的是信号可能丢失。

2)Linux中信号编号小于SIGRTMIN的信号继承于UNIX系统,是不可靠信号

10.可靠信号

可靠信号支持未决信号排队克服了信号可能丢失的问题,linux后来添加的新信号(编号位于SIGRTMIN和SIGRTMAX之间)都是可靠信号

11.实时信号和非实时信号

  实时信号为可靠信号,非实时信号为不可靠信号

12.SIGCLD和SIGCHLD区别

1)UNIX中,SIGCLD在被进程设置成捕捉后,内核会立刻检查在这之前是否已经有子进程终止了(等待着wait函数),如果有,则立刻调用捕捉函数,而SIGCHLD则不会做这个检查,只管之后的

2)Linux中,SIGCLD等同于SIGCHLD

13.kill函数和raise函数

  1. int kill(pid_t pid, int signo);
  2. int raise(int signo);

kill函数将指定信号发送给指定进程(也可以是自身)进程组,raise函数只能将指定信号发给自身进程。

13.1kill函数的pid

1)pid>0 将信号传给进程标识码为pid 的进程

2)pid=0 将信号传给和目前进程相同进程组的所有进程

3)pid<0 将信号传给进程组识别码为pid 绝对值的所有进程

4)pid=-1 将信号广播传送给系统内所有的进程

13.2Linux中的kill指令

1)Linux指令“kill pid”其实是向进程标识码为pid 的进程发送默认信号SIGTERM,因为SIGTERM信号编号为15,所以“kill pid”和“kill -s 15 pid”和“kill -15 pid”等价,“-s”可以省略,让“-”加在15上;

2)进程收到SIGTERM信号,将会发生以下事情:进程释放相应资源后终止(类似于让进程正常退出);进程可能仍然继续运行;

3)Linux指令“kill -s 9 pid”表示向进程发送SIGKILL信号来强制杀死进程;

4)SIGTERM信号可以被捕捉和忽略,SIGKILL信号则不可以;

5)Linux信号编号为0的信号为空信号,“kill -s 0 pid”常被用来确定一个指定pid的进程是否存在;

14.alarm函数和pause函数

  1. unsigned int alarm(unsigned int seconds);
  2. int pause(void);

1)alarm函数设置一个定时器,经过seconds定时器超时,会产生SIGALRM信号,此信号的默认动作是终止进程,一般将信号设置成捕捉,就可以实现相应的定时操作了;

2)pause函数是进程挂起直到捕捉到某个信号,与alarm函数配合时只有当捕捉函数执行完,pause函数才释放进程;

3)每个进程只能有一个闹钟时间,如果在调用alarm时,之前已经为该进程注册的定时器还没有超时,则这个定时器的剩余时间将会作为本次调用alarm的返回值,然后闹钟时间被更新:

  1. ret = alarm();
  2. sleep();
  3.  
  4. ret = alarm(); //ret值为2,闹钟时间重新定成5s
  5. sleep();
  6.  
  7. ret = alarm(); //ret值为4,闹钟时间重新定成5s

15.常见信号

1) SIGCHLD:一个进程终止时,SIGCHLD信号被送给其父进程

2)SIGINT:中断信号,ctrl+c,用来中断进程

3)SIGKILL(9):强制杀死任一进程,不可被捕捉和忽略

4)SIGSTOP:一个作业控制信号,停止一个进程,不可被捕捉和忽略

5)SIGTERM(15):kill命令默认的终止信号

6)SIGPIPE:在读进程已终止时进行写操作,将产生此信号

信号(signal)的更多相关文章

  1. Linux进程间通信(一): 信号 signal()、sigaction()

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  2. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  3. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  4. Linux 信号signal处理函数

    转自:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html alarm(设置信号传送闹钟) 相关函数 signal,slee ...

  5. 进程间通信之信号量、消息队列、共享内存(system v的shm和mmap)+信号signal

    进程间通信方式有:System v unix提供3种进程间通信IPC:信号量.消息队列.共享内存.此外,传统方法:信号.管道.socket套接字. [注意上述6种方式只能用户层进程间通信.内核内部有类 ...

  6. python进程间通信--信号Signal

    信号signal 是python进程间通信多种机制中的其中一种机制.可以对操作系统进程的控制,当进程中发生某种原因而中断时,可以异步处理这个异常. 信号通过注册的方式‘挂’在一个进程中,并且不会阻塞该 ...

  7. Linux信号(signal)机制【转】

    转自:http://gityuan.com/2015/12/20/signal/ 信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式 一.信号类型 Linux系统共定义 ...

  8. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  9. python练习笔记——利用信号signal处理僵尸进程

    1 signal处理僵尸进程的基于语法 利用信号signal处理僵尸进程的方法:signal(SIGCHLD,SIG_IGN),该方法也是第三种处理僵尸进程的方法. SIGCHLD:子进程状态改变后产 ...

  10. 13信号signal

    信号 传送给进程的事件通知,完成异步通信 信号的产生 1.程序错误:硬件异常,除数为0,等 2.外部事件:定时器事件,按键中断(ctrl+c)等 3.显示请求:调用 kill,  raise 等信号发 ...

随机推荐

  1. java课程之团队开发冲刺1.1

    一.今日目标 1.完成课程助手的日期显示以及周数显示功能 2.将功能表改成侧面功能栏 3.将代码重新规范,尽量使得主函数简洁明了

  2. java第一章抽象和封装

    面向过程和面向对象有什么区别? 面向过程的核心是函数,以功能为中心,实现了函数级别的代码重用. 面向对象的核心是封装了属性和方法(行为)的类,以数据为中心,实现了类级别的代码重用. 面向对象因为采用了 ...

  3. PowerScript数据类型及变量

    PowerBuilder的标准数据类型共有14种 数据类型 意    义 示    例 Blob 二进制数据 可存放可变长度的大量数据,如图片,其它类型的文档数据. 如保存位图 Boolean 布尔型 ...

  4. Win7远程桌面:发生身份验证错误

    下载并安装KB4103718补丁,安装完成后重启计算机 http://www.catalog.update.microsoft.com/Search.aspx?q=KB4103718 根据操作系统选择 ...

  5. 关于TCP窗口大小

    窗口字段 TCP Window字段用于接收端通知发送端:接收端当前能够接收的字节数(即当前允许发送端发送的字节数).在TCP Header中占有16bit长度,如下所示 0 1 2 3 0 1 2 3 ...

  6. VirtualBox虚拟机E_INVALIDARG (0x80070057)

    转自:http://www.wzwzl.com/zblog/blog_wz/32.html 打开以前的VirtualBox虚拟机文件时,错误提示:返回 代码:E_INVALIDARG (0x80070 ...

  7. Pyhon入门基础(1)---Pycharm安装及破解

    一.下载安装 1.首先我们可以对比一下社区版和专业版的区别: 2.下载地址:https://www.jetbrains.com/pycharm/download/ 当我们开发的项目比较大的时候通常会涉 ...

  8. HTML5-盒子的使用

    一. border-color border-width border-style 属性用法遵循顺时针顺序. border-top- border-left- border-bottom- borde ...

  9. Redis数据类型-Strings

    Redis 简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI ...

  10. SqlServer数据库链接字符串

    完整链接字符串: 1."DataSourse=.\你的实例;Initial Catalog=yourdatabase;User ID=*;Password=*;Trusted_Connect ...