信号方式(中断)

信号的基本概念

  每个信号都对应一个正整数常量(称为signal  number,即信号编号。定义在系统头文件<signal.h>中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。实质上,信号机制是对中断机制的一种模拟,故又把它称为软中断。

信号与中断的相似点

(1)采用了相同的异步通信方式;
(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3)都在处理完毕后返回到原来的断点;
(4)对信号或中断都可进行屏蔽。

信号与中断的区别

(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。

信号机制

(1)发送信号。发送信号的程序用系统调用kill( )实现;
(2)预置对信号的处理方式。接收信号的程序用signal( )来实现对处理方式的预置;
(3)收受信号的进程按事先的规定完成对相应事件的处理。

对信号的处理

  当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。对软中断信号的处理分三种情况进行:

(1)如果进程收到的软中断是一个已决定要忽略的信号(function=1),进程不做任何处理便立即返回;
(2)进程收到软中断后便退出(function=0);
(3)执行用户设置的软中断处理程序。

中断调用kill

int  kill(pid,sig)

  参数定义
  int  pid,sig;
  其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。

(1)pid>0时,核心将信号发送给进程pid。
(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。
(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。

signal(sig,function)

  预置对信号的处理方式,允许调用进程控制软中断信号。

示例程序

 1 // @author 成鹏致远
 2 // @net http://infodown.tap.cn
 3 // @qq 552158509
 4
 5 #include <signal.h>
 6 #include <unistd.h>
 7 #include <stdio.h>
 8 #include <sys/time.h>
 9
10 void SignalHandle(int signal)//信号处理函数
11 {
12     switch(signal)
13     {
14         case SIGHUP://在用户终端连接(正常或非正常)结束时发出
15             printf("Catch Signal:SIGHUP(%d)\n ",signal);
16             break;
17         case SIGINT://用户键入INTER字符(通常是Ctrl+C)
18             printf("Catch Signal:SIGINT(%d)\n ",signal);
19             break;
20         case SIGQUIT://由QUIT字符控制(通常是Ctrl+\)
21             printf("Catch Signal:SIGHUP(%d)\n ",signal);
22             break;
23         case SIGALRM://定时器信号
24             printf("Catch Signal:SIGALRM(%d)\n",signal);
25             break;
26         default:
27             printf("Unknown Signal:%d",signal);
28             break;
29     }
30 }
31
32 int main()
33 {
34     int sec_delay=5;
35
36     printf("Current Process ID:%d\n",(int)getpid());
37
38     signal(SIGINT,SignalHandle); //注册信号和与之对应的信号处理函数
39     signal(SIGQUIT,SignalHandle);
40     signal(SIGALRM,SignalHandle);
41
42     alarm(sec_delay); //设置定时器
43     while(1)
44         pause();//用于将进程挂起直到收到信号为止
45
46     return 0;
47 }

View Code

转载于:https://www.cnblogs.com/lcw/p/3235994.html

【进程】进程通信-信号方式(中断)相关推荐

  1. Linux进程之间通信 信号

    2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程. 3) SIGQUIT 和SIGINT类似, 但由QUIT字符 ...

  2. linux进程通信发送方式,Linux服务器编程——Linux系统编程之进程通信

    进程通信又称IPC IPC方法 方法:管道(最简单) 信号(开销最小) 共享映射区/共享内存(无血缘关系) 本地套接字(最稳定) Linux文件类型: -   文件 d  目录 l   符号链接 s  ...

  3. linux进程管道通信缺点,Linux进程通信(IPC)的方式详解

    前言:Linux进程通信的方式 什么是进程通信?进程通信是指进程之间交换信息 进程通信方式共有6种: 管道(pipe),包括流管道(s_pipe)和有名管道(named pipe) 信号(signal ...

  4. Linux解决僵尸进程的几种方式,SIGCHLD信号设置SIG_IGN处理方式等

    目录 僵尸进程 解决方式 父进程阻塞调用wait() 父进程非阻塞调用waitpid() SIGCHLD信号 SIG_IGN信号 僵尸进程 我们知道linux下进程有种状态叫做僵尸状态; 原因是父进程 ...

  5. linux进程间通讯-信号

    文章目录 进程间通信功能 信号 信号的概念 产生信号的方式 信号的默认(缺省)处理方式 进程接收到信号后的处理方式 kill函数 alarm函数 raise函数 abort函数 pause函数 sig ...

  6. linux存储--进程栈 线程栈 内核栈 中断栈(十六)

    一.栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈 ...

  7. linux进程看门狗使用方式,Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法...

    Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法 [技术领域] [0001] 本发明涉及Linux系统的进程监控技术领域,特别是涉及一种Linux系统中基于看 门狗的精细化进程监控方法及 ...

  8. Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 ...

  9. 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 栈是什么?栈有什么作用? 首先,栈 (stack) ...

最新文章

  1. java 值传递 和 引用传递
  2. mysql从一张表更新另外一张表_MySQL 从一张表update字段到另外一张表中
  3. Ardino基础教程 9_数字电压表
  4. 红黑树(一)之 原理和算法详细介绍
  5. 从0搭建一个Springboot+vue前后端分离项目(二)使用idea进行页面搭建+页面搭建
  6. oracle 并行提交,如何配置Oracle并行处理(上)
  7. LeetCode:2. 两数相加(中等)
  8. SQL语法精讲(包括建库、建表、建视图、查询、增加、删除、修改)
  9. PPT转换PDF格式怎么转换?后悔现在才知道
  10. 【吴恩达机器学习】学习笔记——梯度下降
  11. 选择正确的C/C++ runtime library
  12. android 模拟 ns手柄,Joy-Con Droid可将Android智能机变身为任天堂Switch的手柄
  13. 线性表的链式存储-单链表,从认识到实践
  14. 惠普笔记本电脑重装系统后找不到引导设备
  15. MATLAB中plot函数使用
  16. payscale 美国计算机专业,2016PayScale美国大学排名:计算机专业
  17. opencv学习八:高斯模糊和边缘保留滤波EPF
  18. Git-优雅地解决冲突:使用ours和theirs
  19. FreeSwitch 终端命令详细介绍
  20. 在谷歌地球中找到泰坦尼克号

热门文章

  1. 通用的权限管理系统发布
  2. RUNOOB python练习题1
  3. 【国际专场】laravel多用户平台(SaaS, 如淘宝多用户商城)的搭建策略
  4. Linux基线合规检查中各文件的作用及配置脚本
  5. 关于Binder的点点滴滴(二)
  6. linux indent命令: 调整C原始代码文件的格式
  7. mysql 查出相差年数_MySQL计算两个日期相差的天数、月数、年数
  8. spark的流失计算模型_使用spark对sparkify的流失预测
  9. 怎么样把Java的字符串转化为字节数组?
  10. leetcode 977. 有序数组的平方(双指针)