进程间通信-软中断

内容

  • 使用软中段机制实现Linux进程间通信

机理说明

​ 软中断信号(signal)是一种简单且最基本的进程通信机制,它最大的特点是提供了一种简单的处理异步事件的方法。例如,常见的用户从键盘键入组合键 Ctrl+C 来中断一个程序的运行,或者在两个进程之间通过某个信号来通知发生了异步事件,或者向系统或进程报告突发的硬件故障,如非法指令、运算溢出等。更重要的是,用户进程还可以向自己发送信号以中断进程的执行,并自动转入指定的软中断处理函数去执行用户自行安排的处理内容,处

理完毕后再返回用户进程继续执行,从而为应用程序提供了由用户自行处理随机事件的通信机制。软中断信号实现 (signal implementation) 是操作系统用来通知进程有事情发生的一种机制。由于这种信号总是在进程处于运行状态时才会去响应,故称之为软中断信号。软中断信号的使用者是操作系统和源程序,操作系统事先将系统的中可以使用的软件中断信号进行集中编码并定义相应含义后,提交用户使用。用户可以通过相应的软件中断序号或软中断名称来使用软中断,二者在使用上是等效的。用户只能在操作系统提供的软件中断序号范围内使用软件中断信号,不能自己创建新的软件中断信号。如果用户的应用程序之间有信号需要发送,则可以使用操作系统预留给用户使用的用户信号 SIGUSR1 或用户信号 SIGUSR2。

序号 名称 含义
1 SIGHUP 挂起
2 SIGINT Ctrl+C
3 SIGQUIT Ctrl+\
4 SIGILL 非法指令
5 SIGTRAP 自陷,跟踪代码执行
6 SIGIOT IOT指令
7 SIGBUS 总线错
8 SIGFPE 浮点数例外
9 SIGKILL 终止进程
10 SIGUSR1 用户定义信号1
11 SIGEGV 段越界
12 SIGUSR2 用户定义信号2
13 SIGPIPE 向非法管道中写数据
14 SIGALARM 闹钟警报
15 SIGTERM 软件中止
16 。。。
17 SIGCHLD 子进程死亡
18 。。。

Linux 的软中断信号在/usr/src/linux-2.4/include/asm/signal.h 中定义。

调用函数说明

预置一个软信号

signal(sig , function)

参数说明:

sig系统给定的软中断中的序号或名称(查表)

function与软中断信号关联的函数名,捕捉到软中断信号后转到该函数执行

发送一个软信号

int kill(pid ,sig)

功能:向pid发送sig

参数说明:

pid表示一个或一组进程的标识号

pid值 含义
>0 发送给特定的pid进程
=0 发送给同组的所有进程
=-1 发送给同用户标识符的进程

sig软中断信号的序号或名称

​ 注意:只能是核心或超级用户进程才能 kill 来向任意的其他进程发送软中断信号,而普

通用户进程只能 kill 向同组或同用户标识的进程发送软中断信号,而不能向任意的其他进程

发送软中断信号。

思路

​ 先使用 signal() 系统调用函数进行预置。预置的目的是将某个软中断信号与某个可执行的处理函数进行关联,当信号发出并被指定的进程接收后,系统就中断接收该软件中断信号进程的执行,转而执行与信号相关联的函数,该函数执行完毕后再返回被中断的进程继续执行。

​ 事实上,除了用户定义信号 SIGUSR1 和 SIGUSR2 外,其他软中断信号都已经由操作系统预置了相应的处理函数,用户进程如果对这些软中断信号进行了预置,则使该信号与新的函数进行关联,当该软中断信号被接收时,转而执行的不再是操作系统预置的处理函数,而是用户对该软中断信号重新预置的处理函数。

​ 对于同一个软中断信号,可以通过多个 signal() 系统调用分别与不同的处理函数进行关联。系统在响应该软中断信号时,执行的是当前预置的处理函数(最近预置的),从而实现同一软中断信号在不同的情况下转向不同的处理函数去执行。

实例

使用软中断实现父子进程间通信

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<string.h> int k; void int_func(int sig) /*中断处理函数*/
{
k=0;
} main()
{
int p;
int shmid;
char *viraddr;
char buffer[BUFSIZ]; signal(SIGUSR1,int_func); /*预置信号对应的函数*/
k=1; shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT);
viraddr=(char*)shmat(shmid,0,0); while((p=fork())==-1);
if(p==0)
{
while(k==1); /*等待父进程发软中断信号*/
printf("Your message is :\n%s",viraddr);
/*输出共享存储区内容*/
shmdt(viraddr); /*断开共享存储区*/
shmctl(shmid,IPC_RMID,0); /*撤销共享存储区*/
exit(0);
}
else
{
while(1)
{
puts("Enter some text:");
fgets(buffer,BUFSIZ,stdin); /*从stdin中读入输入内容*/
strcat(viraddr,buffer); /*追加到共享存储区*/
if(strncmp(buffer,"end",3)==0)
break;
}
shmdt(viraddr); /*断开共享存储区*/
kill(p,SIGUSR1); /*发送一个中断信号*/
exit(0);
}
}

Linux-软中断通信的更多相关文章

  1. linux进程的软中断通信

    linux进程的软中断通信 要求 实现软中断通信的程序 使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个 ...

  2. Linux 软中断

    本文转载自: http://blog.chinaunix.net/uid-9620812-id-3833377.html,如有需要,请移步访问. Technorati 标签: Linux 软中断 -- ...

  3. linux软中断与硬中断实现原理概述

    linux软中断与硬中断实现原理概述. 1.软中断通过open_softirq注册一个软中断处理函数,即在软中断向量表softirq_vec数组中添加新的软中断处理action函数. 2.调用rais ...

  4. Linux进程通信----匿名管道

    Linux进程通信中最为简单的方式是匿名管道 匿名管道的创建需要用到pipe函数,pipe函数参数为一个数组表示的文件描述字.这个数组有两个文件描 述字,第一个是用于读数据的文件描述符第二个是用于写数 ...

  5. 怎么理解Linux软中断?

    1.什么是中断 中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求. 2.为什么要有中断呢? "举个生活中的例子" ...

  6. Linux 进程通信之 ——信号和信号量总结

    如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存.       所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ...

  7. linux进程通信

    e14: 进程间通信(进程之间发送/接收字符串/结构体): 传统的通信方式: 管道(有名管道 fifo,无名管道 pipe) 信号 signal System V(基于IPC的对象):         ...

  8. linux 进程通信 管道

    1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...

  9. Linux 多线程通信

    摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同一时候使用.只是要注意的是线程间须要做好同步,一般用mutex ...

  10. 【linux】U-BOOT与linux kernel通信: struct tag

      欢迎转载,转载时需保留作者信息. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://b ...

随机推荐

  1. I/O模型系列之三:IO通信模型BIO NIO AIO

    一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...

  2. Docker实践之02-使用镜像及定制

    目录 一.获取镜像 二.使用镜像启动容器实例 三.列出镜像 四.删除本地镜像 五.定制镜像 通过commit命令定制镜像 通过Dockerfile定制镜像 docker build的工作原理 dock ...

  3. 将Python3导出为exe程序

    一.pyinstaller简介 Python是一个脚本语言,被解释器解释执行.它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各 ...

  4. 2、搭建一个简单的Web项目

    一.创建一个Web项目: 1.File->new Project->Java->JavaEE->Web Application 2.为项目起名: 3.配置项目:在项目上击右键- ...

  5. 转载:C++中堆和栈的区别

    C++中堆和栈的区别,自由存储区.全局/静态存储区和常量存储区     文章来自一个论坛里的回帖,哪个论坛记不得了!    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和 ...

  6. 开启IIS的WebGarden、WebFarm和StateServer之旅

    前言 公司系统虽然配置有1台NLB后拖4台App Server最后搭一台强劲无比的DB Server,但每天下午4点左右总被投诉系统慢,报表下载不了等问题.究其原因,原来NLB采用锁定sessionI ...

  7. pmi-ACP考试知识点梳理(部分)

    敏捷宣言 个体和互动 高于流程和工具 工作的软件 高于详尽的文档 客户合作 高于合同谈判 响应变化 高于遵循计划 十二条敏捷原则 1 我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意. ...

  8. docker load 镜像时出现:open /var/lib/docker/tmp/docker-import-500852078/repositories: no such file or dir

    网上下载了一些镜像的压缩包,使用docker load的时候会出现如下错误: open /var/lib/docker/tmp/docker-import-500852078/repositories ...

  9. 在线激活win10、win8/8.1和office2019、2016、2013等的kms激活工具

    在线激活win10.win8/8.1和office2019.2016.2013等的kms激活工具 MicroKMS神龙版能激活win10.win8/8.1.win7以及server2008/2012/ ...

  10. postgresql分析函数

    参考:https://blog.csdn.net/haohaizijhz/article/details/83340814 SELECT uid, odate, num, sum(num) over ...