【进程】进程通信-信号方式(中断)

信号方式(中断)

信号的基本概念

  每个信号都对应一个正整数常量(称为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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter notebook 入门教程

原文链接&#xff1a;https://www.dataquest.io/blog/jupyter-notebook-tutorial/ Jupyter notebook 是一个很强大的交互式和展示数据科学项目的工具&#xff0c;它可以作为一个开发文档&#xff0c;包含代码、解释说明文字、代码运行结果、数学公式等等&#xff0c;功能非常强…

【图像分类】细粒度图像分类是什么,有什么方法,发展的怎么样

欢迎大家来自《图像分类》专栏&#xff0c;今天讲述细粒度图像分类问题&#xff0c;这是计算机视觉领域一项极具挑战的研究课题&#xff0c;本文介绍了细粒度图像分类算法的发展现状、相关数据集和竞赛&#xff0c;供大家参考学习。作者 | 郭冰洋编辑 | 言有三1 简介细粒度图像…

Jupyter 进阶教程

2019 年第 65 篇文章&#xff0c;总第 89 篇文章本文大约 7500 字&#xff0c;建议收藏阅读原题 | Tutorial: Advanced Jupyter Notebooks作者 | Benjamin Pryke译者 | kbsc13("算法猿的成长"公众号作者)原文 | https://www.dataquest.io/blog/advanced-jupyter-note…

Jupyter进阶教程

原题 | Tutorial: Advanced Jupyter Notebooks 作者 | Benjamin Pryke 译者 | kbsc13("算法猿的成长"公众号作者) 原文 | https://www.dataquest.io/blog/advanced-jupyter-notebooks-tutorial/ 声明 | 翻译是出于交流学习的目的&#xff0c;欢迎转载&#xff0c…

jQuery Mobile高手必备的十大技巧和代码片段

本文转自51ito布加迪编译版本: http://mobile.51cto.com/hot-276160.htm 其中未发现英文原作链接&#xff0c;为尊重版权&#xff0c;google之后附上: http://www.webdesignerdepot.com/2011/05/10-handy-jquery-mobile-tips-and-snippets-to-get-you-started/ jQuery Mobile高…

PyTorch 系列 | 数据加载和预处理教程

图片来源&#xff1a;Unsplash&#xff0c;作者&#xff1a;Damiano Baschiera2019 年第 66 篇文章&#xff0c;总第 90 篇文章本文大约 8000 字&#xff0c;建议收藏阅读原题 | DATA LOADING AND PROCESSING TUTORIAL作者 | Sasank Chilamkurthy译者 | kbsc13("算法猿的成…

PyTorch系列 | 如何加快你的模型训练速度呢?

图片来源&#xff1a;Pixabay&#xff0c;作者&#xff1a;talha khalil2019 年第 67 篇文章&#xff0c;总第 91 篇文章本文大约 6500 字&#xff0c;建议收藏阅读&#xff01;原题 | Speed Up your Algorithms Part 1 — PyTorch作者 | Puneet Grover译者 | kbsc13("算法…

Leetcode 系列 | 反转链表

点击上方“算法猿的成长”&#xff0c;选择“加为星标”第一时间关注 AI 和 Python 知识最近会更新一个 leetcode 的刷题系列&#xff0c;每次更新一道题目&#xff0c;并且通过画图辅助介绍自己的解题思路&#xff0c;大家如果有更好的解题思路也欢迎在文末留言&#xff0c;或…

Android UI开发第二十九篇——Android中五种常用的menu(菜单)

Android Menu在手机的应用中起着导航的作用&#xff0c;作者总结了5种常用的Menu。 1、左右推出的Menu 前段时间比较流行&#xff0c;我最早是在海豚浏览器中看到的&#xff0c;当时耳目一新。最早使用左右推出菜单的&#xff0c;听说是Facebook&#xff0c;我不确定消息的真实…

深度学习的一些经验总结和建议| To do v.s Not To Do

关注&置顶“Charlotte数据挖掘”每日9:00&#xff0c;干货速递&#xff01;昨天看到几篇不同的文章写关于机器学习的to do & not to do&#xff0c;有些观点赞同&#xff0c;有些不赞同&#xff0c;是现在算法岗位这么热门&#xff0c;已经不像几年前一样&#xff0c;可…

PyTorch系列 | 快速入门迁移学习

点击上方“算法猿的成长”&#xff0c;选择“加为星标”第一时间关注 AI 和 Python 知识图片来源&#xff1a;Pexels&#xff0c;作者&#xff1a;Arthur Ogleznev2019 年第 68 篇文章&#xff0c;总第 92 篇文章本文大约 6800 字&#xff0c;建议收藏阅读原题 | TRANSFER LEAR…