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

news2024/11/15 19:32:18

实验目的

  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 process

        lockf(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 process

            lockf(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 p1

        wait(NULL);

        kill(p2, 16);                // send signal 16 to end the process p2

        wait(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 process

        lockf(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 p1

        wait(0);                       //waiting for the ending of p1



        lockf(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 p2

            wait(0);                       //waiting for the ending of p2

            lockf(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;

}

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

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

相关文章

【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 消息对话框QMessageBox 文章编号&#xff1a;Q…

基于长短期记忆网络 LSTM 的下一个单词预测

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

Parallels Desktop 19虚拟机助你一机多用

Parallels Desktop 19 mac虚拟机是一款功能强大且易于使用的虚拟化软件&#xff0c;它允许用户在Mac电脑上同时运行Windows、Linux和其他多种操作系统&#xff0c;为用户提供了极大的灵活性和兼容性。 Parallels Desktop 19获取 这款虚拟机软件具有直观易用的界面&#xff0c;…

云动态摘要 2024-06-11

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [低至1折]腾讯混元大模型产品特惠 腾讯云 2024-06-06 腾讯混元大模型产品特惠,新用户1折起! 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用 最新产品更新 云服务器运维监…

您的计算机时间有误

问题 使用 apt update 更新软件时报错&#xff0c;提示 Release 文件已过期。 另外还发现&#xff0c;命令行 Ping 百度是通的&#xff0c;但是通过浏览器无法访问百度网站 解决 浏览器已经有很明确的的提示了&#xff1a;您的计算机时间有误。 所以&#xff0c;同步一下…

【总线】设计fpga系统时,为什么要使用总线?

目录 为什么用总线 为什么选择AMBA 总结 系列文章 【总线】AMBA总线架构的发展历程-CSDN博客 【总线】设计fpga系统时&#xff0c;为什么要使用总线&#xff1f;-CSDN博客 为什么用总线 在FPGA系统设计中&#xff0c;使用总线是为了实现组件间的高效互联与通信&#xff0c…

鸿蒙轻内核A核源码分析系列四(2) 虚拟内存

本文我们来熟悉下OpenHarmony鸿蒙轻内核提供的虚拟内存&#xff08;Virtual memory&#xff09;管理模块。 本文中所涉及的源码&#xff0c;以OpenHarmony LiteOS-A内核为例&#xff0c;均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 获取。如果涉及开发板…

超详细十大排序算法

一、排序总结 性能指标&#xff1a;稳定性&#xff0c;时间复杂度&#xff0c;空间复杂度 排序算法的稳定性是指当排序的元素中存在相同的值时&#xff0c;排序算法能够保持它们原先的相对顺序。如果一个排序算法是稳定的&#xff0c;那么在排序后&#xff0c;相同值的元素在原…

uni-admin:基于uni-app与uniCloud的云端管理后台开发神器

随着移动互联网和云计算技术的飞速发展&#xff0c;越来越多的企业和开发者开始寻求一种快速、高效且灵活的解决方案来构建自己的管理后台系统。在这样一个背景下&#xff0c;uni-admin应运而生&#xff0c;它基于uni-app和uniCloud&#xff0c;为开发者提供了一个功能强大、易…

YOLO检测环境安装配置

YOLO介绍 YOLO学习手册&#xff1a;YOLO教程 YOLO [ˈjoʊloʊ]&#xff08;You Only Look Once&#xff09;是一种快速而准确的目标检测算法&#xff0c;由Joseph Redmon等人在2016年提出。YOLO被广泛应用于计算机视觉领域&#xff0c;包括实时视频分析、自动驾驶、安防监控、…

理解 Bearer Token:什么是它以及如何运作?

在当前数字化时代&#xff0c;网络安全尤为关键。随着技术快速进步&#xff0c;需求日益增长&#xff0c;保障应用程序中用户数据的安全成为开发者们的首要任务。其中&#xff0c;Bearer Token 作为一种高效的验证策略&#xff0c;在防止未授权访问中发挥着不可或缺的作用。 解…

高清实拍类型视频素材去哪里找?高清实拍素材网站分享

在这篇文章中&#xff0c;我将为大家介绍一些高清实拍类型的视频素材资源&#xff0c;这些资源对于我们新媒体创作者来说至关重要。优质的视频素材能显著提升作品的吸引力&#xff0c;因此选择合适的视频素材平台非常关键。下面我将详细介绍几个非常实用的视频素材平台&#xf…

CV技术指南 | 其实Mamba是一种线性注意力?清华大学黄高团队揭秘开视觉Mamba的真实面目!

本文来源公众号“CV技术指南”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;其实Mamba是一种线性注意力&#xff1f;清华大学黄高团队揭秘开视觉Mamba的真实面目&#xff01; 前言 本文揭示了 Mamba 模型与 Linear Attention …

shell脚本和变量

一、shell脚本 脚本就是可运行的代码的集合&#xff0c;脚本语言&#xff08;计算机语言&#xff09;的特点&#xff1a;从上到下&#xff0c;按行执行。 Python&#xff1a;脚本语言&#xff0c;格式更严谨&#xff0c;严格地执行缩进。也是从上到下按行执行。 shell脚本运…

Linux文件权限信息和Linux文件与文件夹的管理

目录 前言一、系统环境二、Linux文件权限信息2.1 查看Linux文件权限信息2.2 修改Linux文件权限信息2.2.1 chmod命令2.2.2 chown命令 三、Linux文件与目录的管理3.1 查看文件或文件夹3.1.1 查看文件内容3.1.2 查看文件夹内容 3.2 新增文件或文件夹3.2.1 新增文件3.2.2 新增文件夹…

从零开始利用MATLAB进行FPGA设计(七)固化程序

FPGA开发板&#xff1a;AX7020&#xff1b;Xilinx 公司的 Zynq7000 系列的芯片XC7Z020-2CLG400I&#xff0c;400引脚 FBGA 封装。 HARDWARE PLATFORM在2019以后的vivado中已经没有了。本期实际上已经与MATLAB无关&#xff0c;主要介绍通过VITIS等方法进行程序固化。 目录 ZY…

光伏+储能,势在必行!

随着全球对可再生能源需求的不断增长&#xff0c;光伏行业正迎来前所未有的发展机遇。然而&#xff0c;光伏发电的间歇性和不稳定性特点&#xff0c;使得储能技术成为解决其并网难题、提高能源利用效率的关键。因此&#xff0c;“光伏储能”的组合&#xff0c;已成为行业发展的…

老生常谈!程序员为什么要阅读源代码?

大家好&#xff0c;我是码农先森。 阅读源码这是一个老生常谈的话题了&#xff0c;但又是很多人想做又没有付出行动的事情。前段时间我研究了 Swoole 的源代码&#xff0c;并且输出了系列的源码分析文章「感兴趣的朋友可以翻阅以前的文章」。虽然这个过程很枯燥和艰难&#xf…

c++ 6.11

作业&#xff1a; 思维导图&#xff1a; 作业题&#xff1a; 搭建一个货币的场景&#xff0c;创建一个名为 RMB 的类&#xff0c;该类具有整型私有成员变量 yuan&#xff08;元&#xff09;、jiao&#xff08;角&#xff09;和 fen&#xff08;分&#xff09;&#xff0c;并且…

VMware Workstation虚拟机进入U盘PE系统

注意事项 VMware Workstation虚拟机版本不能高于16.1.2版本&#xff01;&#xff01;&#xff01; 本实验使用的版本如下 实际操作 在已安装好的虚拟机处右键&#xff0c;点击设置。虚拟机安装win10教程请参考VMware Workstation安装win10操作系统-CSDN博客 在弹出的窗口点击…