西南交通大学【操作系统实验2】

2024-06-11 17:44

本文主要是介绍西南交通大学【操作系统实验2】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验目的

  1. 本实验要求学生了解什么是信号,掌握软中断的基本原理;掌握中断信号的使用、进程的创建以及系统计时器的使用。
  2. 通过对本实验的学习,学生能够学会进程的创建方法,更能加深对Linux中的信号机制的认识,并会使用软中断信号来实现进程间的通信。

实验内容

学生根据test2.c理解以下内容:

  1. 1.父进程接受到软中断信号(SIGQUIT)后,向其子进程分别发送整数值为    16的软中断信号,子进程获得对应软中断信号后,终止运行。
  2. 2.父进程调用wait()函数等待子进程终止,然后自我终止。
  3. 3.由父进程创建一个子进程,通过终端输入Crtl+\组合键向父进程发
  4. 送SIGQUIT软中断信号发送给父进程。

编程实现以下内容:

  1. 1.由一个父进程创建两个子进程,之后通过终端输入Crtl+\组合键向父进
  2. 程发送软中断信号,终止两个子进程以及父进程。
  3. 2.由一个父进程创建一个子进程,之后该子进程再创建一个孙进程,通过终端输入Crtl+\组合键向父进程发送软中断信号,依次终止孙进程、子进程、父进程。

实验环境

Ubuntu 12.04 LTS

Device name: oslinux-virtual-machine

Memory: 1001.2MiB

Processor: 13th Gen Intel Core i5-13500HX

Graphics: Unknown

OS type: 32-bit

Disk: 20.3GB

实验步骤

实验 1:编译并运行程序test2.c,当按下Crtl+\组合键时,打印出子进程结束的信息,最后打印出父进程结束的信息。

  1. 1.创建一个子进程;
  2. 2.子进程分别等待信号16,如果收到信号则显示结束信息,并发出结束信号;
  3. 3.父进程等待SIGQUIT信号,如果收到信号则向子进程发送信号16,接着    等子进程结束,如果都结束了则显示结束信息,并退出进程。

实验2:编写两种三个进程通信情况。

  1. 1.由一个父进程创建两个子进程,之后通过终端输入Crtl+\组合键向父进    程发送软中断信号,终止两 个子进程以及父进程。
  2. 2.由一个父进程创建一个子进程,之后该子进程再创建一个孙进程,通过   终端输入Crtl+\组合键向父进程发送软中断信号,依次终止孙进程、子     进程、父进程。
  3. 3.实验报告附程序源码及对重要代码语句的解释和程序运行结果。

实验结果

结果展示

test2运行结果

进程14571由父进程14570创建,输入Crtl+\后,子进程14571被父进程终止,随后父进程终止。

实验2第一种情况运行结果

子进程14763和14764由父进程14762创建,输入Crtl+\后,子进程分别被父进程终止,随后父进程终止。

实验2第二种情况运行结果

子进程15325由父进程创建,孙进程15326由子进程15325创建,输入Crtl+\后,孙进程被子进程终止,子进程被父进程终止,随后父进程终止。

核心代码

实验2第一种情况源码

#include<cstdio>#include<cstdlib>#include<csignal>#include<unistd.h>#include <sys/wait.h>#include "iostream"using namespace std;void waiting();void stop();int wait_mark;int main(){pid_t p1, p2;p1 = fork();if (p1 != 0) {             // if p1 is parent processlockf(1, 1, 0);cout << "Parent Process " << getpid() << endl;lockf(1, 0, 0);wait_mark = 1;::signal(SIGQUIT, reinterpret_cast<__sighandler_t>(stop));p2 = fork();if (p2 == 0) {           // if p2 is child processlockf(1, 1, 0);cout << "Child Process " << getpid() << " created by " << getppid() << endl;lockf(1, 0, 0);::signal(SIGQUIT, SIG_IGN);wait_mark = 1;::signal(16, reinterpret_cast<__sighandler_t>(stop));waiting();lockf(1, 1 , 0);cout << "Child Process " << getpid() << " is killed by parent " << getppid() << endl;lockf(1, 0, 0);::exit(0);}waiting();kill(p1, 16);               // send signal 16 to end the process p1wait(NULL);kill(p2, 16);                // send signal 16 to end the process p2wait(NULL);lockf(1, 1, 0);cout << "parent process if killed" << endl;lockf(1, 0, 0);::exit(0);} else if (p1 == 0) {             // if p1 is child processlockf(1, 1, 0);cout << "Child Process " << getpid() << " created by " << getppid() << endl;lockf(1, 0, 0);::signal(SIGQUIT, SIG_IGN);wait_mark = 1;::signal(16, reinterpret_cast<__sighandler_t>(stop));waiting();lockf(1, 1 , 0);cout << "Child Process " << getpid() << " is killed by parent " << getppid() << endl;lockf(1, 0, 0);::exit(0);}return 0;}void waiting( ){while (wait_mark != 0);}void stop(){wait_mark=0;}

实验2第二种情况源码

#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<unistd.h>#include <sys/wait.h>void waiting();void stop();int wait_mark;int main() {int p1, p2;while ((p1 = fork()) == -1);if (p1 > 0)                             //if p1 is parent process{lockf(1, 1, 0);printf("parent process is %d \n", getpid());lockf(1, 0, 0);wait_mark = 1;signal(SIGQUIT, stop);waiting();kill(p1, 16);                    //send signal 16 to end the process p1wait(0);                       //waiting for the ending of p1lockf(1, 1, 0);printf("parent process is killed!\n");lockf(1, 0, 0);exit(0);                       //quit from the parent process} else                             //if p1 is child process{while ((p2 = fork()) == -1);if (p2 > 0)                     //if p2 is parent process{lockf(1, 1, 0);printf("child process %d is created by the parent %d \n", getpid(), getppid());lockf(1, 0, 0);signal(SIGQUIT, SIG_IGN);wait_mark = 1;signal(16, stop);waiting();kill(p2, 16);                    //send signal 16 to end the process p2wait(0);                       //waiting for the ending of p2lockf(1, 1, 0);printf("child process %d is killed by parent %d \n", getpid(), getppid());lockf(1, 0, 0);exit(0);                             // p1 quit} else                           //if p2 is child process{lockf(1, 1, 0);printf("grandson process %d is created by the parent %d \n", getpid(), getppid());lockf(1, 0, 0);signal(SIGQUIT, SIG_IGN);wait_mark = 1;signal(16, stop);waiting();lockf(1, 1, 0);printf("grandson process %d is killed by parent %d \n", getpid(), getppid());lockf(1, 0, 0);exit(0);                          // p2 quit}}return 0;}void waiting() {while (wait_mark != 0);}void stop() {wait_mark = 0;}

这篇关于西南交通大学【操作系统实验2】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051856

相关文章

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

1、简述linux操作系统启动流程

1、简述linux操作系统启动流程 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。开机时将ROM中的指令映射到RAM的低地址空间,CPU读取到这些指令,硬件的健康状况进行检查,按照BIOS中设置的启

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信