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

简介: 软中断通信***

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


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

1046ea4cf1ae40cbb6b10efc0f37c6f0.gif

啊不,阅读一些材料。不了解没有办法做实验哦~

若觉文字太多,可直接阅读红体字~~

【实验必读材料】:

一、信号的基本概念:

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

二、几个函数调用:


1、***Signal()**

预置对信号的处理方式,允许调用进程控制软中断信号。

系统调用格式:signal(sig,function)

头文件为: #include <signal.h>

由于不同系统的信号编号是不完全相同的,所以当前系统中,可以使用“kill -l”命令查看信号编号。


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

微信图片_20220412180150.png

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 为欲等待的子进程识别码,其他数值意义如下:**


微信图片_20220412180258.png

【实验目的】:

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发送用户自定义信号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);
} 
}}
运行结果
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进程有了中断和通信更多的认识,学会了一些函数的应用,但是这只是很小一部分,我还需要课下多查阅资料,加强和巩固自己的学习。

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

a6a50a10071e432a9dd55ad7d9e139d4.jpg


相关文章
|
4月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品体验与功能反馈摘要** 运维人员发现OS Copilot易上手,文档清晰,助其高效排查故障(8/10分)。愿意推荐并参与开源开发。亮点在于知识问答,能快速筛选答案。相较于竞品,优点是新手友好、文档清晰,但功能扩展性待增强。期望增加系统错误排查与解决方案,并集成ECS等,以优化系统安装流程。
阿里云操作系统智能助手OS Copilot实验测评报告
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是针对Linux的智能助手,助力学习、运维及编程。用户界面直观,自然语言交互方便新手。官方文档详尽,但初次配置略复杂,适合学生和开发者。在提高代码编写和调试效率、系统学习上得分高,功能亮点包括代码生成、问答和命令执行。用户期待更多操作系统支持、自动错误分析和系统排查功能。
183 3
|
4月前
|
弹性计算 人工智能 运维
阿里云操作系统智能助手OS Copilot实验测评报告
阿里云操作系统智能助手OS Copilot实验测评报告
110 2
|
4月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot的实验测评报告
OS Copilot 产品体验摘要 用户角色与场景:一位计算机学生使用辅助学习和解决问题,特别是通过代码解释功能加深理解。 易用性与文档:初者可能会觉得有些细节不明确。 帮助程度:用户给予极高评价,对学习帮助大,评分10分,快速定位和解决代码问题,提升学习效率。 推荐与参与:用户愿意推荐给他人。 功能体验:用户尝试了所有功能,对知识问答、辅助编程和命令执行特别感兴趣,尤其是命令执行帮助大。 对比其他产品:OS Copilot优点是便捷、准确。 期望功能:用户希望增加自动报错分析和系统错误排查。 联动体验:用户期待,以实现更全面的工具集。 总结:整体体验积极,用户看好其潜力,期待改进和未来联动。
|
4月前
|
弹性计算 运维 Python
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品测评摘要** - 学生使用,用于学习和编码,发现上手难度较高,指引文档不清晰,特别是Access ID设置和代码复制流程。 - 功能上,评分9分,辅助编程和知识问答功能显著提升了学习效率,减少了错误。 - 愿意推荐,并有兴趣参与开源开发以提升自我。 - 希望增强错误排查,提供具体错误原因和位置。 - 联动ACK智能助手可增强学习效果。 [链接]: https://developer.aliyun.com/topic/instructions-for-os-copilot
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot的实验测评报告
阿里云OS Copilot是AI驱动的Linux操作系统助手,助于系统管理和运维。学生反馈它在代码解释和编写上有很大帮助,给予8-9分的评价。功能亮点包括自然语言问答、辅助编程和命令解释,简化操作,提升效率。尽管易用,但需基础Linux知识。用户期待更多功能如系统优化建议和代码优化。与ACK智能助手配合,实现故障排查和运维。适合寻求效率提升的个人和团队。
68 0
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
阿里云OS Copilot是面向Linux的智能助手,助运维工程师提升效率。易上手,文档清晰,对新人友好。提供自然语言问答、编程辅助,尤善理解与响应。评分10/10,推荐给同行。目前侧重辅助编程,期望支持更多OS、并发命令执行及错误分析。适合集成于ECS等,打造自动化工作流。期待开源版本与社区合作。
97 0
|
3天前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
12 0
Vanilla OS:下一代安全 Linux 发行版
|
6天前
|
人工智能 安全 Linux
|
27天前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。