【Linux实验】软中断通信

news2025/7/9 11:47:12

实验目的:
1.了解什么是信号,熟练掌握signal(),wait(),exit(),kill()函数。
2.熟悉并掌握Linux系统中进程之间采用软中断通信的基本原理。

在这里插入图片描述

其中用到的Linux系统函数文章末尾有讲解

在这里插入图片描述

# include<stdio.h>
# include<signal.h>
# include<unistd.h>
# include<sys/wait.h>
#include<stdlib.h>
int wait_mark;
void waiting(){while(wait_mark!=0);}
void stop(){wait_mark=0;}
int main()
{ 
  int  p1, p2;
  signal(SIGINT,stop); //signal()初始位置
  while((p1=fork())==-1);
  if(p1>0)
{  
    while((p2=fork())==-1);
    if(p2>0)
    { 
      wait_mark=1;
      waiting( );      
      wait(0);
      wait(0);
      printf("parent process is killed!\n");
      exit(0);
    }
    else 
    {
        wait_mark=1;
        waiting( );
	    lockf(1,1,0);
        printf("child  process 2 is killed by parent!\n");
        lockf(1,0,0);
        exit(0);
    }
  } 
   else
 {
    wait_mark=1;    
    waiting( );
    lockf(1,1,0);
    printf("child  process 1 is killed by parent!\n");
    lockf(1,0,0);
    exit(0);
   }
}
  • 用 gcc 编译后再 ./ +文件名 运行即可
  • 键盘输入信号 CRTL+C 得到下图运行结果:

在这里插入图片描述

结果分析:

  1. 系统调用signal( )进行预置,让父进程捕捉由键盘发来的中断信号,当系统捕捉到中断信号后,调用预置的stop函数,子进程捕捉到信号后,输出信息终止,(child1、child2输出顺序不定。)父进程等待两个子进程结束后,也输出信息终止。
  2. 父进程用了两个wait(0)的原因:等待2个子进程都结束再执行。
  3. 每个进程退出时都用了语句exit(0)的原因:正常运行程序并退出程序。为了保证每个进程执行完后,shell能及时回收资源。

拓展:

        修改并调试程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其原因。注意:实验前先用kill命令查询本机用户自定义信号的编号。

       程序主要功能:子进程屏蔽外部中断信号(Ctrl-C);父进程接收用户按Ctrl-C产生的外部中断信号后,分别给两个子进程发信号(用户自定义信号)

# include<stdio.h>
# include<signal.h>
# include<unistd.h>
# include<sys/wait.h>
#include<stdlib.h>
int EndFlag,pid1,pid2;
void IntSend()
{
  kill(pid1,10);//向进程pid1发送用户自定义信号10
  kill(pid2,12);// 向进程pid2发送用户自定义信号12
  EndFlag=1;
}
void Print1()
{
   printf("child process 1 is interrupted by parent !\n");
   exit(0);
}
void Print2()
{
   printf("child process 2 is interrupted by parent !\n");
   exit(0);
}
int main()
{
 
     int exitcode;
     signal(SIGINT,SIG_IGN);
     signal(SIGQUIT,SIG_IGN);

	
while((pid1=fork())==-1);
if(pid1==0)
{ 
	signal(SIGUSR1, Print1);     //用户自定义信号1
	signal(SIGQUIT,SIG_IGN);
	pause();
	exit(0);
}
else
     {
		while((pid2=fork())==-1);
   		if(pid2==0)
   		{   		
  		signal(SIGUSR2, Print2);	  //用户自定义信号2
		signal(SIGQUIT,SIG_IGN);
		pause();
		exit(0);
    	}
   		else
    	{
    		signal(SIGINT, IntSend);
      		waitpid(-1,&exitcode,0);
      		printf("parent process is interrupted! \n");
      		exit(0);
		} 
	}
}

运行结果:

^Cchild process 1 is interrupted by parent !
child process 2 is interrupted by parent !
parent process is interrupted!

结果分析:

  • 子进程屏蔽外部中断信号,父进程接收用户按“Ctrl+C”产生的外部中断信号后,分别给两个子进程发信号(用户自定义信号)。
  • 系统调用signal( )进行预置,子进程接收自定义信号后,调用预置的print函数,打印输出。(child1、child2顺序不定)。
  • 语句‘waitpid(-1,&exitcode,0)’代表父进程等待任何子进程,接收子进程状态结束值。等待子进程结束后,父进程打印输出,结束。

软中断通信:
了解了基本知识,硬中断,操作系统系统外设状态的变化。为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断来完成。基本的思路是: 父进程生成子进程,父进程发送信号并等待,子进程接收信号,然后自我终止并唤醒父进程,父进程再自我终止。


其中用到的函数介绍:

Signal()
预置对信号的处理方式,允许调用进程控制软中断信号。
系统调用格式:signal(sig,function)
头文件为: #include <signal.h>
由于不同系统的信号编号是不完全相同的,所以当前系统中,可以使用“kill -l”命令查看信号编号

名字说明
01SIGHUP挂起(hangup)
02SIGINT中断,当用户从键盘按ctrl+c或break键。
03SIGQUIT退出,当用户从键盘按quit键时
04SIGILL非法指令
05SIGTRAP跟踪陷阱(trace trap),启动进程,跟踪代码的执行
06SIGIOTIOT指令
07SIGEMTEMT指令
08SIGFPE浮点运算溢出
09SIGKILL杀死、终止进程
10SIGBUS总线错误
11SIGSEGV进程试图去访问其虚地址空间以外的位置
12SIGSYS系统调用中参数错,如系统调用号非法
13SIGPIPE向某个非读管道中写入数据
14SIGALRM闹钟。当某进程希望在某时间后接收信号时发此信号
15SIGTERM软件终止
16SIGUSR1用户自定义信号1
17SIGUSR2用户自定义信号2
18SIGCLD某个子进程死
19SIGPWR电源故障

kill()
系统调用格式:int kill(pid,sig)
参数定义
int pid,sig;
其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。
(1)pid>0时,操作系统将信号发送给进程pid。
(2)pid=0时,操作系统将信号发送给与发送进程同组的所有进程。
(3)pid=-1时,操作系统将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。


lockf()
头文件:#include <unistd.h>
允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直到资源解除锁定为止。当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。当进程终止时,将释放进程保留的所有锁定。
lockf(fd,1,0)是给文件上锁; lockf(fd,0,0)是给文件解锁;


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

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

相关文章

Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation

学习目标&#xff1a; Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation&#xff08;零参考深度曲线估计&#xff09; 个人体会&#xff1a; 本文的特色就是使用了PA和CA,对不同通道和不同像素做不同处理,虽然本文的实现过程懂了,但是实现去雾…

缝纫机牙架的数控工艺工装设计与编程

目 录 绪 论 1 2.差动牙架的工艺设计 3 2.1 机械加工工艺规程概述 3 2.2.1 零件的技术条件 4 2.2.2 加工表面及其要求 5 2.2.3零件的材料 6 2.3毛坯的选择 6 2.3.1毛坯的种类 6 2.4 基准的选择 8 2.5 机械加工工艺路线的拟订 10 3 差动牙架的工装设计 17 3.1 夹具概述 17 3.2 …

牛客CM11 - 链表分割【环形链表雏形】

看来真的不能乱割呀~一、题目描述二、思路分析三、代码详解【保姆级教学】四、环形链表的疑难解惑五、整体代码展示六、总结与提炼一、题目描述 描述 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&am…

数据库-范式

目录 完全函数依赖部分函数依赖传递函数依赖码主属性非主属性第一范式(1NF)第二范式(2NF)第三范式(3NF)例题完全函数依赖 每一个属性都有用,缺一个都不能决定。 部分函数依赖 部分属性用不到,也可以决定 传递函数依赖

抽象类和(上)

大家好&#xff0c;又见面了&#xff0c;今天和大家浅谈一下抽象类 抽象类存在的意义就是被继承 抽象类 &#x1f437;1.抽象类的定义 &#x1f431;‍&#x1f680;2.抽象类的语法 &#x1f49a;3.抽象类的概念 &#x1f680;4.抽象类的作用 1.抽象类的概念 什么是 好…

[附源码]java毕业设计基于个性化的汽车购买推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何在Ubuntu 22.04上安装Linux 内核 6.0?

内核是任何基于 Linux 的操作系统的核心部分&#xff0c;它充当计算机系统软件和硬件之间的桥梁&#xff0c;还提供用户和应用程序与计算机交互所需的接口。内核提供了许多功能&#xff0c;包括进程调度、资源分配、设备管理、中断处理、内存管理和进程。 在撰写本文时&#x…

轻松学会jQuery选择器的用法

文章目录⛳️ 选择器✨ 属性选择器✨ 包含选择器✨ 位置选择器✨ 过滤选择器✨ 反向选择器⛳️ 快速投票⛳️ 选择器 本篇重点讲解jQuery中丰富的选择器&#xff0c;以及他们的基本用法。CSS的选择器均可以用jQuery的$进行选择&#xff0c;部分浏览器对CSS3的选择器支持不全&am…

大道至简,凯里亚德酒店成为酒店投资圈万众瞩目的“新”星

作为近年酒店市场的热门领域&#xff0c;中端酒店行业的发展一直颇受关注。随之而来的就是中端酒店品牌的不断增加&#xff0c;以及中端商旅、度假型酒店规模的不断扩大&#xff0c;经行业资深人士分析&#xff0c;未来中端酒店将成为酒店市场的主力产品。鉴于市场的发展趋势&a…

Netty中的缓存Bytebuf

首先我们来明确一下Buffer&#xff08;缓存&#xff09; JavaNIO中的Buffer、Netty中的Buffer、Netty中的Bytebuf这是3个不同的类&#xff0c;但实现的内容和完成的功能几乎一致&#xff0c;最原始的是JavaNIO中的Buffer实现&#xff0c;最先进的是Netty中Bytebuf的实现&#x…

10 分钟, 带你彻底掌握 SQL 多表查询

1.前言 多表查询&#xff0c;也称为多表连接查询&#xff1b;作为关系型数据库最主要的查询方式&#xff0c;在日常工作中被广泛使用 常见的多表查询操作包含&#xff1a;子查询、内连接、左外连接、右外连接、完全连接、交叉连接 本篇文章将利用一个实例逐一介绍这些操作 …

【华为OD机试真题 python】 太阳能板最大面积【2022 Q4 | 100分】

■ 题目描述 给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同&#xff0c;太阳能…

做一名既有宽度也有深度的测试!

一名好的测试人员&#xff0c;在工作中&#xff0c;不仅要做到有宽度更要有深度&#xff01; 何为宽度&#xff1f;测试用例的覆盖面更广更全。 测试人员设计测试用例的时候可以分为这几种类型&#xff1a; 一&#xff1a;将prd的需求描述copy到测试用例。 二&#xff1a;细…

Java线程安全与对象头结构信息

文章目录一 线程安全问题1.1 什么是线程安全问题&#xff1f;1.2 自增运算真的线程安全吗&#xff1f;1.3 Synchronized锁表现三种形势&#xff1f;1.3.1 synchronized同步方法1.3.2 synchronized同步代码块1.3.3 synchronized静态方法1.3.4 总结二 Java对象结构与内置锁2.1 Ja…

浏览器自动化利器Selenium IDE使用指南

文章目录前言一、安装及界面1.1 安装1.2 界面二、常用命令2.1 通用2.2 表单2.3 流程控制三、常用操作3.1 命令操作3.2 js脚本3.3 录制3.4 导出四、实际操作例子4.1 红黑树插入可视化4.2 github下载参考前言 Selenium 是一个浏览器自动化框架&#xff0c;专门为 W3C WebDriver …

创龙AD+全志T3 TL7606I模块测试

上一篇&#xff1a;创龙AD全志T3 ad_display 开发案例(2) 前 言 本文主要介绍基于全志科技T3(ARM Cortex-A7)处理器的8/16通道AD采集开发案例&#xff0c;使用核芯互联CL1606/CL1616AD芯片&#xff0c;亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 …

力扣(LeetCode)775. 全局倒置与局部倒置(C++)

模拟 理解题&#xff0c;全局倒置就是不相邻的逆序对&#xff0c;局部倒置就是相邻的逆序对。提示中给出&#xff0c;0<nums[i]<n0 < nums[i] < n0<nums[i]<n &#xff0c;其中 nnums.lengthn nums.lengthnnums.length , numsnumsnums 中的所有整数 互不相…

什么是 rektguy NFT系列?

rektguy 系列是一组闪烁着霓虹灯颜色的饮酒骷髅 该项目背后的团队没有提出路线图或分支项目 艺术家 OSF 已经在 NFT 生态系统中拥有一个成熟的粉丝群体 rektguy NFT系列由 8,814 个 NFT 组成&#xff0c;展示了穿着连帽衫、用瓶子喝水的骷髅。这些人物由深黑色背景上闪烁的霓…

[论文阅读] 颜色迁移-EM概率分割的局部颜色迁移

[论文阅读] 颜色迁移-EM概率分割的局部颜色迁移 文章: Local Color Transfer via Probabilistic Segmentation by Expectation-Maximization,[paper][code(未公开)] 本文目的为: 图像局部颜色迁移. 1-符号说明 在进行本文算法原理说明之前, 先对一些英文缩写进行简单说明: …

一次nacos 导致的 CPU 飙高问题

序 今天下午突然 出现 测试环境 cpu飙高&#xff0c;干到了 60%&#xff0c;其他项目 响应时间明显变长。。。有点吓人&#xff0c;不想背锅 项目背景 出问题的项目是 需要连接各个不同nacos 和不同的 namespace 进行对应操作的 一个项目&#xff0c;对nacos的操作都是httpC…