实验四:软中断通信***


大家好呀~~~今天是小白学操作系统系列第四篇。在开始之前,~~让我们先来摆烂

啊不,阅读一些材料。不了解没有办法做实验哦~
若觉文字太多,可直接阅读红体字~~

【实验必读材料】:

一、信号的基本概念:

每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行

二、几个函数调用:

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

下表仅供参考,不同系统信号不一样哦~:

名字 说明
01 SIGHUP 挂起(hangup)
02 SIGINT 中断,当用户从键盘按ctrl+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 软件终止
16 SIGUSR1 用户自定义信号1
17 SIGUSR2 用户自定义信号2
18 SIGCLD 某个子进程死
19 SIGPWR 电源故障

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

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

lockf(fd,1,0)是给文件上锁; lockf(fd,0,0)是给文件解锁;**

4、***pause()***
头文件:#include <unistd.h>
定义函数:int pause(void);
函数说明:pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断.
返回值:只返回-1.
****

5、***waitpid()**
头文件
#include<sys/types.h>
#include<sys/wait.h>
如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状态值。 子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码,其他数值意义如下:**

pid数值 解释
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。

【实验目的】:

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

【实验内容】:

一、编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )进行预置,让父进程捕捉由键盘发来的中断信号(即同时按下Ctrl+C键)。当系统捕捉到中断信号后,调用预置的stop函数,子进程捕捉到信号后,分别输出下列信息后终止:
Child process 1 is interrupted by parent!
Child process 2 is interrupted by parent!
父进程等待两个子进程终止后,输出以下信息后终止:
Parent process is interrupted!

参考代码:
# 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 interrupted!\n");exit(0);}else {wait_mark=1;waiting( );lockf(1,1,0);printf("child  process 2 is interrupted by parent!\n");//可以输出多条语句试试看是否能插入其他进程的输出语句lockf(1,0,0);exit(0);}} else{wait_mark=1;    waiting( );lockf(1,1,0);printf("child  process 1 is interrupted by parent!\n");//这里也可以输出多条语句试试看lockf(1,0,0);exit(0);}
}
运行结果:
yzy@yzy-virtual-machine:~/new$ ./a.out
^Cchild  process 2 is interrupted by parent!
child  process 1 is interrupted by parent!
parent process is interrupted!
分析结果:

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发送用户自定义信号10kill(pid2,12);// 向进程pid2发送用户自定义信号12EndFlag=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);   //用户自定义信号2signal(SIGQUIT,SIG_IGN);pause();exit(0);}else{signal(SIGINT, IntSend);waitpid(-1,&exitcode,0);printf("parent process is interrupted! \n");exit(0);
}
}}
运行结果
yzy@yzy-virtual-machine:~/new$ ./b.out
^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为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断来完成。基本的思路是: 父进程生成子进程,父进程发送信号并等待,子进程接收信号,然后自我终止并唤醒父进程,父进程再自我终止

心得体会:
通过本次实验我了解了软中断通信和管道通信进一步认识到了并发的实质,对Linux进程有了中断和通信更多的认识,学会了一些函数的应用,但是这只是很小一部分,我还需要课下多查阅资料,加强和巩固自己的学习。

**点赞的都是小可爱哦**~

作业必备:操作系统实验四【软中断通信】相关推荐

  1. 操作系统实验四——使用命名管道实现进程通信

    操作系统实验四--使用命名管道实现进程通信 一. 实验目的 (1)了解windows系统环境下的进程通讯机制. (2)熟悉Windows系统提供的进程通信API. 二. 实验准备 相关API函数介绍 ...

  2. C语言 操作系统实验 四种调度(最高响应比优先算法 HRN)

    注: 本文是四个调度算法的第一篇算法. 本文是根据CSDN上某一FCFS调度算法魔改来的,所以FCFS的算法不会发到网站. 我是个菜鸡,发文是为了纪念自己完成了代码,以及累计自己的经验. 如有知识错误 ...

  3. linux软中断通信的基本原理,实验三 软中断通信

    实验三 软中断通信 实验目的 1.了解什么是信号 2.熟悉LINUX系统中进程之间软中断通信的基本原理 实验内容 1.编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕 ...

  4. 广州大学2020操作系统实验四:文件系统

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  5. 操作系统实验四-LRU算法的模拟

    操作系统实验四:页式虚拟存储管理的模拟 一.实验目的: 掌握存储管理的基本原理.地址变换过程:用软件实现地址转换过程:用一种常用的页面置换算法来处理缺页中断并研究其命中率. 二.实验题目: 1.模拟请 ...

  6. 操作系统实验·Linux进程通信与内存管理

    预备知识 Linux进程的数据结构 在Linux中,进程用task_struct表示,所有进程被组织到以init_task为表头的双向链表中(见[include/linux/sched.h]SET_L ...

  7. 操作系统实验四 进程运行轨迹的跟踪与统计(哈工大李治军)

    实验4 进程运行轨迹的跟踪与统计 实验目的 掌握 Linux 下的多进程编程技术: 通过对进程运行轨迹的跟踪来形象化进程的概念: 在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调度算法进行 ...

  8. 2020 操作系统 实验二 进程通信

    实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...

  9. 操作系统实验四:内存管理

    实验四 内存管理 一.实验要求 (1)通过在Linux环境下对内存管理的基本操作了解Linux如何对内存及虚拟内存进行管理: (2)掌握可变分区管理内存的方法. 二.实验内容 (1)验证实验: ① L ...

  10. Linux操作系统实验系列之实验四管道通信

    一.实验目的 1.了解什么是管道 2.熟悉UNIX/LINUX支持的管道通信方式 二.实验内容: 编写程序实现进程的管道通信.用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句 ...

最新文章

  1. Java1.8 帮助文档
  2. 定时任务的并发_03
  3. 天津大学考研计算机专业课的教材,天津大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  4. MySQL快速上手[学习笔记](一)
  5. linux下三三维建模软件,SolidWorks是基于()原创的三维实体建模软件。A.UNIXB.WindowsC.LinuxD.Dos...
  6. mysql的逻辑备份和恢复
  7. [集成IronPython] 使用Module扩展IronPython
  8. 智能优化算法:蜜獾算法-附代码
  9. 从零开始Unity引擎学习
  10. 通过一个简单例子看懂遗传算法,附MATLAB代码
  11. 流水灯程序总结:关于Crol和cror的用法
  12. 常数乘以无穷大等于多少_无穷加减一个常数等于多少
  13. html自动汉字转拼音,输入汉字转换成拼音首字母js代码
  14. Kafka消费者消费方式
  15. 微信小程序选择图片(相册中选择/相机拍摄)
  16. 【python】BeautifulSoup的应用
  17. java项目统一打印入参出参等日志
  18. 黑马头条移动端搜索推荐失效 ,求解决
  19. Jenkins基础: root URL设定
  20. oracle报表查询sql,63.Oracle数据库SQL开发之 高级查询——使用报表函数

热门文章

  1. 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明
  2. ecap捕捉epwm波形的占空比及频率(总结)
  3. GDS List内容详情
  4. 捋一捋Android的转场动画
  5. 关于泊松分布在测序原理中的解释
  6. bilibili无水印php,bilibili播放器带弹幕接口源码
  7. 数字人技术在直播场景下的应用
  8. 受难周第五日-团契日
  9. LNMP 平台的 redis 对接安装
  10. MVC5局部视图的调用