西南交通大学【操作系统实验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 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;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《银行存量客户运营》导读

前言&#xff1a;在中国生活&#xff0c;没有一个人能够离得开银行&#xff0c;但是又有多少人真正了解银行呢&#xff1f; 通过本书你可以学习到&#xff1a;银行不为外人了解的内部运营机制&#xff0c;甚至可以提前把握银行涨息降息政策规律 银行运营的基础逻辑 “运营”二…

泉城济南的隐秘珍宝与山东旅游必去十大景点

泉城济南的隐秘珍宝与山东旅游必去十大景点 济南&#xff0c;这座历史悠久的城市&#xff0c;不仅以其丰富的人文底蕴著称&#xff0c;还拥有诸多引人入胜的自然景观。在这片华夏神州广阔的齐鲁大地上&#xff0c;济南特别以其“三无风景区”——无影山、无影潭、无影泉——而闻…

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句&#xff0c;主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时&#xff08;即试图插入的记录的键值已经存在于表中&#xff09;&#xff0c;此子句会触发一…

neo4j 3.5.5版本创建新的数据库

neo4j 3.5.5版本创建新的数据库 1.找到neo4j的conf文件 点进去 2.点击neo4j.conf 选择记事本打开 3.把graph.db换成自己想要创建的数据库名称 4.打开neo4j服务 出现新的数据库

AI Agent 热门的10篇论文

人工智能代理领域广阔,涵盖广泛的主题,包括多代理系统、强化学习、上下文感知系统以及将大型语言模型 (LLMs) 集成到基于代理的系统中。以下是 arXiv 的一些顶级论文,涵盖了人工智能代理的各个方面: A Framework For Intelligent Multi Agent System Based Neural Network …

rman恢复后,少部分数据文件状态为MISSING000**

客户有套一体机&#xff0c;每天晚上21点开始做rman完全备份&#xff0c;大约第2天上午9点多完成备份&#xff0c;rman备份保留策略保留一份完全备份 6月1日晚21点自动发起备份&#xff0c;6月2日上午10点15分完成备份&#xff0c;并生成了一个控制文件备份 c-4063271871-2024…

量产导入 | KGD 是什么?

文章目录 KGD 是什么&#xff1f;认识KGD定义、功能与应用实例【白话文解析】Known Good「Die」何谓良品裸晶粒 &#xff08;KGD/KGD Die&#xff09;&#xff1f;解读KGD产业应用为什么大家纷纷采用KGD&#xff1f; 一窥KGD与芯片封测大趋势 KGD 是什么&#xff1f;认识KGD定义…

【Linux系统】线程与线程控制

本篇博客整理了Linux下线程的概念、线程控制的相关接口&#xff0c;旨在让读者初步认识线程&#xff0c;并为下一篇多线程作铺垫。 目录 一、线程是什么 1.线程是进程的执行流 2.线程的执行、调度、切换 3.页表分级与线程资源分配 4.线程的优缺点 二、线程控制 1.创建…

mmdeploy环境部署流程

参考&#xff1a;mmdeploy/docs/zh_cn/01-how-to-build/linux-x86_64.md at main open-mmlab/mmdeploy (github.com) 从零入门《openmmlab》mmdeploy[1]环境安装及简单上手_哔哩哔哩_bilibili 我的环境&#xff1a; docker容器&#xff0c;ubuntu20.04&#xff0c;cuda11.7…

【万方数据库爬虫简单开发(自用)】

万方数据库爬虫简单开发&#xff08;自用&#xff09;&#xff08;一&#xff09; 使用Python爬虫实现万方数据库论文的搜索并获取信息1.获取url2.输入关键词3.使用BeautifulSoup解析4.获取文章标题信息 使用Python爬虫实现万方数据库论文的搜索并获取信息 后续会逐步探索更新…

从盛世到衰落,历史上八大强国的兴衰与现代地位!

人类文明史悠久&#xff0c;从远古时代至今日&#xff0c;世界舞台上曾经涌现出许多强盛的帝国。它们在自己的黄金时代&#xff0c;曾经无人能敌&#xff0c;不论是在军事、经济还是文化上都独领风骚。然而&#xff0c;无论多么强大的国家也难逃“兴盛必衰”的命运。今天&#…

javaWeb项目-在线考试系统详细功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java简介 Java语…

ArcGIS 10.8软件安装包免费下载及安装教程

安装包获取&#xff1a; 【软件名称】&#xff1a;ArcGIS 10.8 【安装包链接 】&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/2240330bf935 提取码&#xff1a;Yixn 【备用链接】&#xff1a; 链接:https://pan.baidu.com/s/13V5o_igcK0suW4SFsWkxeQ?pwdj6kx 提取码…

Springboot 整合 Flowable(一):使用 flowable-UI 绘制流程图

目录 一、Flowable简介 二、Flowable 与 Activiti 的区别 三、流程图的绘制&#xff08;以员工请假流程图为例&#xff09; 1、下载 flowable 的压缩包&#xff1a; 2、启动包中的 tomcat 3、登录页面 4、绘制结束&#xff0c;导出 bpmn20.xml文件 一、Flowable简介 Fl…

拥抱AI-图片学习中的卷积神经算法详解

一、定义 卷积神经算法&#xff08;Convolutional Neural Networks, CNN&#xff09;是深度学习领域中的一种重要算法&#xff0c;特别适用于处理图像相关的任务。以下是卷积神经算法的详细解释&#xff1a; 1. 基本概念 定义&#xff1a;卷积神经网络是一类包含卷积计算且具…

Oracle的优化器

sql优化第一步&#xff1a;搞懂Oracle中的SQL的执行过程 从图中我们可以看出SQL语句在Oracle中经历了以下的几个步骤&#xff1a; 语法检查&#xff1a;检查SQL拼写是否正确&#xff0c;如果不正确&#xff0c;Oracle会报语法错误。 语义检查&#xff1a;检查SQL中的访问对象…

文件IOoooo

1.1 文件路径 文件路径分为两种&#xff1a; 1、绝对路径&#xff1a;以C:、D:等盘符开头的&#xff0c;就是我们所说的绝对路径&#xff0c;根据它可以直接找到文件的具体位置。 2、相对路径&#xff1a;需要先指定一个目录作为基准目录&#xff0c;从基准目录出发&#xf…

python的resample()函数

介绍 在Python中,resample()函数是一个常用的工具,用于对时间序列数据进行重新采样。这个函数可以将时间序列数据从一个频率转换为另一个频率,比如将每天的数据转换为每月的数据。在本教程中,我将向你展示如何使用resample()函数,并解释每个步骤的具体含义。 整体流程 首先…

SAP PP学习笔记20 - 复习总结一下MTS,MTO,ATO的各种生产策略

上面几章详细讲了MTS&#xff0c;MTO&#xff0c;ATO的各种生产策略。 内容太多了&#xff0c;本章咱们就简单回顾&#xff0c;复习一下。 计划策略(Planning Strategies) 的种类 - MTS&#xff08;Make-to-Stock&#xff09;&#xff1a;按库存生产&#xff08;見込生産&…

SAP CR02 更改工作中心 CRAP_WORKCENTER_CHANGE

SAP 创建&#xff0c;修改工作中心实例代码 SE24 CL_PP_WORK_CENTER_BO Work Center API Business Object UPDATE_CAPACITY Update Capacity GET_INSTANCE Get instance of class CL_PP_WORK_CENTER_BO CREATE_WORK_CENTER Create Work Center UPDATE_WORK_CENTER …