IO练习:用信号实现司机和售票员问题

news2024/9/22 13:45:55

【1】问题描述 

1)售票员捕捉SIGINT(代表开车)信号,向司机发送SIGUSR1信号,司机打印(let's gogogo)

2)售票员捕捉SIGQUIT(代表停车)信号,向司机发送SIGUSR2信号,司机打印(stop the bus)

3)司机捕捉SIGTSTP(代表到达终点站)信号,向售票员发送SIGUSR1信号,售票员打印(please get off the bus)

4)司机等待售票员下车,之后司机再下车。

 【2】代码展示

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>


//SIGINT信号由键盘 ctrl+c 产生
//SIGQUIT信号由键盘 ctrl+\ 产生
//SIGTSTP信号由键盘 ctrl+z 产生
//通过按下对应键盘按键即可产生信号


int pid;//定义一个全局变量
void seller(int sig)//售票员进程
{
    if (sig == SIGINT)//如果捕捉的信号是 SIGINT
        kill(getppid(), SIGUSR1);//就向父进程发送 SIGUSR1 信号
    else if (sig == SIGQUIT)//如果捕捉的信号是 SIGQUIT
        kill(getppid(), SIGUSR2);//就向父进程发送 SIGUSR2 信号
    else if (sig == SIGUSR1)//如果捕捉的信号是 SIGUSR1
    {
        printf("     下车下车下车\n");//下车
        exit(0);//子进程退出(售票员下车)
    }
}

void Driver(int sig)
{
    if (sig == SIGUSR1)//如果捕捉的信号是 SIGUSR1
        printf("     发车了发车了!!!~~\n");//发车
    else if (sig == SIGUSR2)//如果捕捉的信号是 SIGUSR2
    {
        printf("     停车停车,我要下车\n");//下车
    }
    else if (sig == SIGTSTP)//如果捕捉的信号是 SIGTSTP
    {
        kill(pid, SIGUSR1);//向子进程发送 SIGUSR1 信号
        wait(NULL);//等待子进程结束,回收子进程资源
        exit(0);//回收完子进程资源之后,父进程也退出(司机要等待售票员下车之后再下车)
    }
}

int main(int argc, char const *argv[])
{
    pid = fork();//创建进程
    if (pid < 0)//进程创建失败
    {
        perror("fork err\n");
        return -1;
    }
    else if (pid == 0)//子进程(售票员)
    {
        printf("i am seller\n");
        signal(SIGTSTP, SIG_IGN);//忽略 SIGTSTP 信号
        signal(SIGINT, seller);//捕捉 SIGINT 信号,以信号处理函数 seller来处理该信号
        signal(SIGQUIT, seller);//捕捉 SIGQUIT 信号,以信号处理函数 seller来处理该信号
        signal(SIGUSR1, seller);//捕捉 SIGUSR1 信号,以信号处理函数 seller来处理该信号
    }
    else//父进程(司机)
    {
        printf("i am driver\n");
        signal(SIGINT, SIG_IGN);//忽略 SIGINT 信号
        signal(SIGQUIT, SIG_IGN);//忽略 SIGQUIT 信号
        signal(SIGTSTP, Driver);//捕捉 SIGTSTP 信号,以信号处理函数 Driver来处理该信号
        signal(SIGUSR1, Driver);//捕捉 SIGUSR1 信号,以信号处理函数 Driver来处理该信号
        signal(SIGUSR2, Driver);//捕捉 SIGUSR2 信号,以信号处理函数 Driver来处理该信号
    }

    while (1)//循环挂起进程,不占用CPU,且不会结束进程
        pause();

    return 0;
}

 【3】运行结果


 今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话点个关注支持一下吧!

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

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

相关文章

x-cmd pkg | lazydocker - Docker 和 docker-compose 的 Terminal UI

目录 简介快速上手功能特点竞品和相关项目进一步探索 简介 lazydocker 是由 Jesse Duffield 用 Go 语言开发的 Docker 和 docker-compose 的 Terminal UI 管理工具。它提供 docker 的终端图形界面&#xff0c;支持鼠标操作和键盘快捷键&#xff0c;能实时监控 docker 容器&…

python简介及开发环境配置总结

参考&#xff1a;Python 基础教程 | 菜鸟教程 (runoob.com) Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python 由 Guido van Rossum 于 1989 年底发明&#xff0c;第一个公开发行版发行于 1991 年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU G…

国风高铁站可视化:传统文化与现代科技的融合

图扑国风高铁站可视化系统展示了浓厚的传统文化元素&#xff0c;结合现代科技&#xff0c;使旅客在便捷出行的同时体验独特的文化风情。高铁站可视化管理系统通过实时监控和数据分析&#xff0c;为车站运营人员提供全面、直观的管理工具&#xff0c;提升决策效率。

物联网架构之HBase

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

06.登录页面开发

1. 前言 前面已经完成了一些基础的配置&#xff0c;接下来开始进入真正的开发阶段。开发过程中会涉及到一些其它插件的集成&#xff0c;这里用到什么就记录一下使用的心得体会。 这里需要交代一下&#xff0c;项目里的文件命名规则&#xff0c;以及文件结构&#xff0c;views…

数学建模之入门篇

目录 什么是数学建模 建模、编程、写作 一、初步建模选择模型 二、进阶熟练掌握 1. 数学模型 线性规划 图与网络模型及方法 插值与拟合 灰色预测 动态规划 层次分析法 AHP 整数规划 目标规划模型 偏最小二乘回归 微分方程模型 博弈论 / 对策论 排队论模型 存…

Java笔试面试题AI答之面向对象(5)

文章目录 25. Java 包装类的实例是否可变&#xff1f;不可变类&#xff08;Immutable Classes&#xff09;特殊情况总结 26. 简述Java什么是自动装箱和自动拆箱&#xff1f;自动装箱&#xff08;Autoboxing&#xff09;自动拆箱&#xff08;Unboxing&#xff09;注意事项 27. J…

[译] APT分析报告:12.APT29利用spy软件供应商创建的IOS、Chrome漏洞

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

秒杀抢券很难吗?oneCoupon带你成为面试中的王牌

秒杀抢券很难吗&#xff1f;oneCoupon带你成为面试中的王牌 如果你在为简历上找不到亮眼的项目发愁&#xff0c;oneCoupon牛券可能就是你的救星。这个系统不仅高性能&#xff0c;还能承受十万次查询和分发请求。本文将带你走进oneCoupon牛券的世界&#xff0c;看看它是如何助力…

【C++】容器vector常用接口详解

目录 一.vector基本介绍 二.vector的构造&#xff08;constructor&#xff09; 三.vector迭代器&#xff08;iterator&#xff09; 四.vector的三种遍历 1.for循环 2.范围for 3.迭代器&#xff08;正向、反向&#xff09; 五. vector扩容操作 1.reserve 2.resize 六.…

自动化邮件发送:结合SMTP协议使用Python发送包含报表或数据附件的邮件

目录 引言 SMTP协议简介 Python中的smtplib模块 基本使用 发送带附件的邮件 自动化邮件发送系统设计 需求分析 系统架构 实现步骤 1. 准备数据源 2. 创建邮件模板 3. 编写邮件发送引擎 4. 设置调度器 5. 异常处理 示例应用&#xff1a;自动化发送报表邮件 总结…

6种有效的时间序列数据特征工程技术(使用Python)

在商业分析中&#xff0c;"时间"是一个核心概念。我们基于时间组件来分析销售数据、收入、利润、增长&#xff0c;甚至进行预测。然而&#xff0c;对于初学者来说&#xff0c;这可能是一个复杂的主题。在处理时间敏感的数据集时&#xff0c;需要考虑时间序列数据的多…

Vue3其他Api

1.shallowRef与shallowReactive <template><div class"app"><h2>求和为:{{ sum }}</h2><h2>名字为:{{ person.name }}</h2><h2>年龄为:{{ person.age }}</h2><button click"sum 1">sum1</butto…

【Docker系列】Docker 日志管理:批量删除策略与实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

剪画:自媒体人都是这么保存无字幕视频素材的!

在数字媒体的精彩世界中&#xff0c;视频如璀璨星辰照亮我们的生活。 无论是教育的启迪、娱乐的放松还是信息的传播&#xff0c;视频都担当着关键角色。 但水印&#xff0c;那以文字或图形形式出现在视频中的印记&#xff0c;虽有声明版权之效&#xff0c;却也常给我们带来困扰…

基于web网上十字绣专营店设计与实现

&#xff08;一&#xff09;业务流程分析 没有实现网上销售的十字绣专营店&#xff0c;即店面销售方式&#xff0c;店面需要专人看管&#xff0c;而且销售范围有限&#xff0c;面向的对象很受限制&#xff0c;销售情况需要店主手工记录到账簿&#xff0c;以备利润汇总&#xf…

脚手架工具的应用(前端和后端搭建)

前端 一、安装 Node.js 环境 使用npm下载镜像 查看镜像&#xff1a;npm config get registry 切换淘宝镜像&#xff1a;npm config set registry https://registry.npmmirror.com 还原镜像&#xff1a;npm config set registry https://registry.npmjs.org 二、使用 Vue.js 脚…

BugKu练习记录:ok

题目&#xff1a; 从特征上看是BrainFuck中的Ook加密&#xff0c;直接用工具解

三天速成数学建模国赛国奖全攻略

这里写目录标题 国赛考点&#x1f5d2;️&#x1f5d2;️01 国赛是如何评奖的&#xff1f;02 国赛历年题型和模型算法1&#xff09;国赛赛题特点2&#xff09;历年国赛赛题类型 建模手三天快速提升计划✨✨01 第一天&#xff1a;模型分类及国赛常见模型的用法了解1&#xff09;…

弹窗相关操作

弹窗使用 文章目录 弹窗使用弹窗-新增表单修改弹窗 弹窗-新增表单 拖拽弹出层组件&#xff0c;补充表单信息 2.点击表单&#xff0c;绑定数据库模型&#xff0c;绑定字段 3.新增弹窗按钮绑定打开或关闭弹出层事件 4.弹窗保存按钮依次绑定 保存表单&#xff0c;打开或关闭弹…