进程软中断通信实验

【预备知识】

进程软中断通信涉及的系统调用描述如下。

1.kill()

进程用kill()向一个进程或一组进程发送一个信号。系统调用格式为int kill(pid,sig)。其中,pid是一个或一组进程的标识符,sig是要发送的软中断信号。信号的发送分如下三种情况。

pid>0时,核心将信号发送给进程pid。

pid=0时,核心将信号发送给与发送进程同组的所用进程。

pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。

2.signal(sig,function)

接收信号的程序用signal()来实现对处理方式的预置,允许调用进程控制软中断信号。系统调用格式为signal(sig function),此时需包含头文件signal.h。其中,sig用于指定信号的类型,sig为0则表示没有收到任何信号,其余类型如表所示。

调用函数使用如下头文件:

#include<signal.h>

参数定义如下:

signal (sig,function)

int sig;

void(*func) ();  

function是该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGKILL、SIGTRAP和SIGPWR以外的信号,核心自动重新设置软中断信号处理程序的值为SIG_DFL,进程不能捕获SIGKILL信号。

function的解释如下:

(1)function=1时,进程对sig类信号不做任何处理便立即返回,亦即屏蔽该类型号。

(2)function=0时,默认值,进程收到sig信号后终止自己。

(3)function为非0、非1类整数时,执行用户设置的软中断处理程序。

(4)signal(SIGINT,SIG_IGN);来让进程忽略SIGINT信号.

信号的类型

名字

说明

01

SIGHUP

挂起(hangup)

02

SIGINT

中断,当用户从键盘按“^c”键或“^break”键时

03

SIGQUIT

退出,当用户从键盘按“quit“键时

04

SIGILL

非法指令

05

SIGTRAP

跟踪陷阱(trace trap)

06

SIGIOT

IOT指令

07

SIGEMT

EMT指令

08

SIGFPE

浮点运算溢出

09

SIGKILL

终止进程

10

SIGBUS

总线错误

11

SIGSEGV

段违例,进程试图去访问其虚地址空间以外的位置

12

SIGSYS

系统调用中参数错,如系统调用号非法

13

SIGPIPE

向某个非读管道中写入数据

14

SIGALRM

闹钟。当进程希望在某时间后接收信号时发此信号

15

SIGTERM

软件终止(software termination)

16

SIGUSR1

用户自定义信号1

17

SIGUSR2

用户自定义信号2

18

SIGCLD

某个子进程死

19

SIGPWR

电源故障

 

编程实现例<一>

【任务】

编程实现,父进程生成子进程,父进程发送信号并等待,子进程接收信号并完成某种功能,然后自我终止并唤醒父进程。

【程序】

#include <stdio.h>#include <signal.h>#include <unistd.h>int func();main(){int i,j;signal(17,func);if(i=fork()){printf(“Parent:  Signal  17  will  be  send t  to  Child! \n ”)kill(i,17);wait(0);printf (“Parent: finished! \n”);}else{sleep(10);printf(“Child: A signal  from  my  Parent  is  received !  \n”);exit();}}func(){printf(“It is  signal  17   processing  function !  \n”)}

修改后的代码:

【运行结果】

【分析】

这是一个父子进程通信的例子。父进程生成子进程,发送信号给子进程,并等待子进程完成某种功能。子进程接收信号,并执行处理函数后自我终止,唤醒父进程。当父进程发送信号给子进程后,子进程会等待10秒钟后接收到信号,并执行信号处理函数,然后自我终止,唤醒父进程。父进程等待子进程结束后输出完成的消息。

编程实现例<二>

【任务】

编制一程,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即DEL键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止。

child process 1 is killed by parent!

child process 2 is killed by parent!

父进程等待两个子进程终止后,输出以下信息后终止。

Parent process is killed!

【程序】

#include <stdio.h>#include <signal.h>#include <unistd.h>int waiting(),stop();int wait_mark;main(){int p1,p2;while ((p1=fork())==-1);if (p1>0){while ((p2=fork())==-1);if (p2>0){printf(“parent\n”);wait_mark=1;signal(SIGINT,stop);  /*接收DEL信号,并转stop()*/waiting();kill(p1,16);          /*向P1发中断信号16*/kill(p2,17);         /*向P2发中断信号17*/wait(0);wait(0);printf(“parent process is killed!\n”);exit(0)}else{printf(“p2\n”);wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN);waiting();lockf(stdout,1,0);printf(“child process 2 is killed by parent!\n”);lockf(stdout,0,0);exit(0);}}else{printf(“p1\n”);wait_mark=1;signal(16,stop)signal(SIGINT,SIG_IGN);waiting();lockf(stdout,1,0);printf(“child process 1 is killed by parent!\n”);lockf(stdout,0,0);exit(0);}}void waiting(){while (wait_mark!=0);}void stop(){Wait_mark=0;}

修改后的代码:

【运行结果】

【分析】

这是一个父进程生成两个子进程的例子。父进程会等待子进程执行完毕后输出 "parent process is killed!" 的消息,并向子进程发送中断信号。子进程接收到中断信号后输出相应的消息。当父进程发送中断信号给子进程后,子进程会输出相应的消息。父进程会等待子进程执行完毕后输出 "parent process is killed!" 的消息

编程实现例<三>

【任务】

在上面程序中,增加语句signal(SIGINT,SIG_IGN)、signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。

【程序】

#include <stdio.h>#include <signal.h>#include <unistd.h>int pid1,pid2;int endflag=0,pf1=0,pf2=0;void intdelete(){kill(pid1,16);kill(pid2,17);endflag=1;}void int1(){printf(“child process 1 is killed by parent!\n”);exit(0);}void int2(){printf(“child process 2 is killed by parent!\n”);exit(0);}main(){int exitpid;signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN);while ((pid1=fork())==-1);if (pid1==0){printf(“p1\n”);signal(SIGUSER1,int1);signal(16,SIG_IGT)pause();exit(0);}else{while ((pid2=fork())==-1);if (pid==0){printf(“p2\n”);signal(SIGUSER2,int2);signal(17,SIG_IGT)pause();exit(0);}else{printf(“parent\n”);signal(SIGINT,intdelete);  /*接收DEL信号,并转intdelete()*/waitpid(-1,&exitpid,0);printf(“parent process is killed!\n”);exit(0)}}}

修改后的代码:

【运行结果】

【分析】

程序中增加了两个语句 signal(SIGINT, SIG_IGN) 和 signal(SIGQUIT, SIG_IGN),将 SIGINT 和 SIGQUIT 信号的处理方式设置为忽略。原因是,

SIGINT 是由终端发送的中断信号,通常由用户按下 Ctrl+C 触发。SIGQUIT 是由终端发送的退出信号,通常由用户按下 Ctrl+\ 触发。

通过将这两个信号的处理方式设置为忽略 (SIG_IGN),程序会忽略这两个信号,不执行默认的信号处理行为。因此,当用户按下对应的终端键时,程序中的子进程不会被杀死,也不会输出相应的消息。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

视频剪辑神器:批量高效处理,轻松锐化视频让影片焕然一新!

视频已经成为我们记录生活、分享故事、展示才华的重要形式。然而&#xff0c;面对大量的视频文件&#xff0c;如何批量高效剪辑并提升视频质量&#xff0c;成为了许多人的难题。现在&#xff0c;我们为您带来一款视频剪辑神器&#xff0c;让您轻松处理视频&#xff0c;让您的影…

Linux Systemd基础教程

一、什么是systemd&#xff1f; systemd是Linux系统的一套基本构建模块。它提供了一个系统和服务管理器&#xff0c;作为PID 1运行并启动系统的其余部分。 systemd提供积极的并行化功能&#xff0c;使用套接字和D-Bus激活来启动服务&#xff0c;提供按需启动守护进程&#xf…

shell常用文件处理命令

1. 解压 1.1 tar 和 gz 文件 如果你有一个 .tar 文件,你可以使用以下命令来解压: tar -xvf your_file.tar在这个命令中,-x 表示解压缩,-v 表示详细输出(可选),-f 后面跟着要解压的文件名。 如果你的 .tar 文件同时被 gzip 压缩了(即 .tar.gz 文件),你可以使用以下…

开发组合php+mysql 人才招聘小程序源码搭建 招聘平台系统源码+详细图文搭建部署教程

随着互联网的快速发展&#xff0c;传统的招聘方式已经不能满足企业和求职者的需求。为了提高招聘效率&#xff0c;降低招聘成本&#xff0c;越来越多的人开始关注人才招聘小程序、在线招聘平台。分享一个人才招聘小程序源码及搭建&#xff0c;让招聘更加高效便捷。系统是运营级…

工厂模式应用实例

引言 设计模式概念 设计模式&#xff08;Design Pattern&#xff09;的官方概念可以表述为&#xff1a;在软件设计中&#xff0c;设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它是针对特定问题或特定场景的解决方案&#xff0c;是一种经过…

04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)

04-22 周日 阿里云-瑶光上部署FastBuild过程 时间版本修改人描述2024年4月22日14:18:59V0.1宋全恒新建文档2024年4月23日20:41:26V1.0宋全恒完成了基本流程的添加 简介 前提 准备两台服务&#xff0c;一台部署Docker&#xff0c;一台部署FastBuild的镜像容器服务所述的Docke…

最高20K/月,安全、数通、云计算多个方向急招,可内推!

高级安全工程师【岗位职责及要求】 1、统筹负责行业客户的安全项目交付&#xff0c;能够独自输出技术方案并完成施&#xff0c;并具备指导初中级工程师实施的能力&#xff1b; 2、掌握H3C全系列安全产品功能并对全系列产品原理有深入了解&#xff0c;能够熟练完成安全产品规划及…

Spring IoCDI(3)—DI详解

目录 一、属性注入 二、构造方法注入 小结&#xff1a;构造函数的注入 三、Setter注入 四、三种注入的优缺点分析&#xff08;面试题&#xff09; 1、属性注入 优点&#xff1a; 缺点&#xff1a; 2、构造方法注入&#xff08;Spring4.X推荐&#xff09; 优点&#x…

python数据分析-老龄化分析

一、研究背景介绍和分析安排 中国作为世界上人口最多的国家&#xff0c;其人口结构的变化对国内外经济都有着深远的影响。近年来&#xff0c;中国的老龄人口比例不断上升&#xff0c;这一变化引起了广泛的社会关注和政策讨论。老龄化带来的挑战包括劳动力市场紧缩、养老金负担…

Innodb实现的索引

概念 一种用于提高数据库查询性能的有序的数据结构。通过使用索引&#xff0c;数据库引擎可以快速定位到存储表中的特定数据&#xff0c;而不必逐行遍历整个表。在处理大量数据的时候可以显著加快数据检索的速度。 通过索引列队数据进行排序&#xff0c;降低数据排序的成本&a…

英语学习笔记4——Is this your ...?

Is this your …? 词汇 Vocabulary suit /sut/ n. 西装&#xff0c;正装 suit 的配套&#xff1a; shirt n. 衬衫tie n. 领带&#xff0c;领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配&#xff1a;middle school 初中    hig…

C++笔记:类与对象(三)->多态

多态 虚函数 先来看一段代码&#xff1a; #include<iostream> using namespace std;class Animal { public :void run() {cout << "I dont know how to run" << endl;} };class Cat : public Animal{ public :void run() {cout << "I …

Elsevier旗下双1区TOP刊,8.8分影响因子加上超低自引率,各指标领跑计算机类SCI

【SciencePub学术】 今天小编给大家带来了一本计算机类的高分优刊解读&#xff0c;隶属于Elsevier出版社&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff0c;影响因子高达8.7&#xff0c;领域相符的学者可考虑&#xff01; APPLIED SOFT COMPUTING 1 期刊概况 【期刊简…

SD-WAN对云服务的优化

在云服务日益普及的当下&#xff0c;SD-WAN技术正成为众多企业优化网络连接的首选方案。其通过优化云集成和连接&#xff0c;以及增强应用程序性能&#xff0c;为企业带来了前所未有的业务效益。这种革新性的云连接方式极大地促进了企业对全球劳动力和潜在客户的触达能力。 软件…

【设计模式实战】用三种设计模式去优化if-else屎山代码!!!

优化前提 【设计模式】之策略模式【设计模式】之工厂模式&#xff08;三种&#xff09;【设计模式】之模板方法模式 前言 我们之前也学习了不少设计模式&#xff0c;今天给大家介绍一个案例&#xff0c;帮助大家更加熟悉设计模式&#xff0c;并能够在自己写项目的时候能够下意…

PXE远程部署CentOS系统

文章目录 在局域网内搭建PXE服务器PXE 启动组件PXE的优点实验一、搭建PXE服务器&#xff0c;实现远程部署CentOS系统环境准备server关闭防火墙安装组件准备 Linux 内核、初始化镜像文件及PXE引导文件配置启用TFTP 服务配置启动DHCP服务准备CentOS 7 安装源配置启动菜单文件 Cli…

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …

解决本地启动项目,用IP地址访问失败问题

解决方法&#xff1a;看看index.html页面有没有 这个标签&#xff0c;将它注释掉

Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】

1、数组 特别需要注意的是&#xff1a;在 Go 语言中&#xff0c;数组长度也是数组类型的一部分&#xff01;所以尽管元素类型相同但是长度不同的两个数组&#xff0c;它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

获取波形极值与间距并显示

获取并显示波形的极值与极值间距 1、流程 1、通过signal.find_peaks获取极大值 2、获取极大值下标 3、获取极大值对应的值 4、获取极大值的下标间距(就是隔多远有一个极大值) 5、获取极大值间距的标准差、方差、均值、最大值 6、图形展示波形图并标记极大值2、效果图 3、示…