首页 > 其他分享 >IO练习:用信号实现司机和售票员问题

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

时间:2024-08-31 09:53:25浏览次数:10  
标签:IO SIGUSR1 signal 练习 捕捉 信号 进程 售票员

【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】运行结果


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

标签:IO,SIGUSR1,signal,练习,捕捉,信号,进程,售票员
From: https://blog.csdn.net/dghbs/article/details/141744775

相关文章

  • IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“
    例如:a线程输出”A”之后b线程输出”B”,然后a线程输出“A”,再b线程输出”B”,之后往复循环。【1】使用信号量实现代码展示:#include<stdio.h>#include<pthread.h>#include<string.h>#include<semaphore.h>#include<unistd.h>//定义两个全局信号量,实现同步机制se......
  • wpf-Application的生命周期
    在WPF中,App类继承自Application类,Application类当中有四个虚方法,分别为OnStartup、OnActivated、OnDeactivated、OnExit。在App类文件中重载这四个方法,同时分别输出以下内容。OnStartup方法:应用程序启动阶段被调用,此方法允许用户在主窗口界面显示之前执行自定义操作,例如身份验......
  • wbemtest.exe 是 Windows 操作系统中的一个实用程序,用于测试和调试 Windows Managemen
    wbemtest.exe起源于Windows操作系统的WMI(WindowsManagementInstrumentation)框架。它首次引入于Windows2000,作为一个图形化工具,帮助用户和开发者测试和调试WMI查询、操作和配置。其目的是简化与WMI服务的交互,提供一个直观的界面用于管理和排查系统管理数据。wbemte......
  • 载波监听多址接入碰撞检测 CSMA/CD(carrier sense multiple access collision detecti
    载波监听多址接入/碰撞检测CSMA/CD(carriersensemultipleaccess/collisiondetection)概念解析在总线局域网使用的协议多址接入MA:多个站连接在同一条线上,竞争使用总线。载波监听CS:每一个站在发送帧之前都要检测一下总线上是否有其他站点在发送帧(”先听后说“)......
  • Elsevier 期刊 Expert SystemsWith Applications 投稿经验
    准备材料1.AuthorAgreement:带全部作者的电子签名,证明全部作者对该论文的知情2.CoverLetter:介绍该文章的工作内容,不是简单的把摘要复制过来3.ORCIDInformation:写上全部作者姓名以及对应的orcid4.Highlights:3-5点即可,这里需要注意字数5.CreditAuthorStatement:说明每一......
  • DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期
    DaVinciResolveStudio19.0正式版(macOS,Windows)-剪辑、调色、特效和音频后期制作BlackmagicDesignDaVinciResolveStudio请访问原文链接:https://sysin.org/blog/davinci-resolve/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgDaVinciResolve19免费!......
  • 致远互联-分析云 getolapconnectionlist 逻辑漏洞
       声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。一、漏洞描述致远分析云是由北京致远互联精心打造的一站式数据分析平台,旨在助力企业实现数字化转型升级。二,fofa语法body="js/lib/ba.co......
  • django.core.exceptions.ImproperlyConfigured: 'django.contrib.gis.db.backends.mys
     没解决此问题(venv)[root@VM-8-12-centosMYPROJECT-django20240830]#python3manage.py runserver0.0.0.0:8080Exceptioninthreaddjango-main-thread:Traceback(mostrecentcalllast): File"/root/MYPROJECT/backend/venv/lib/python3.8/site-packages/django/d......
  • [Raspberry Pi]如何利用docker執行motioneye,並利用Line Notify取得即時通知和照片?
    [Motioneye]Howtosetupmotiondetectionandsendmessage/imageforLineNotify無意間,翻了一本關於樹莓派的書籍,除了樹莓派的簡介和應用外,也包含初階和高階的Linux運作邏輯,書籍結構相當完整,也因此需要花時間細細體會其內容。其在樹莓派的應用內容,提及一款開源影像監視......
  • Mysql基础练习题 596.查询至少有5个学生的所有班级 (力扣)
    596.查询至少有5个学生的所有班级建表插入数据:CreatetableIfNotExistsCourses(studentvarchar(255),classvarchar(255))TruncatetableCoursesinsertintoCourses(student,class)values('A','Math')insertintoCourses(student,class)values(......