• linux进程的软中断通信


    linux进程的软中断通信

    要求

    实现软中断通信的程序
    使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发出整数值为16和17软中断信号,子进程获得对应软中断信号,然后分别输出下列信息后终止:
    Child process 1 is killed by parent !!
    Child process 2 is killed by parent !!
    父进程调用wait()函数等待两个子进程终止后,输入以下信息,结束进程执行:
    Parent process is killed!!
    多运行几次编写的程序,简略分析出现不同结果的原因。

    相关函数

    • signal函数
      signal(sig,function): 捕捉中断信号sig后执行function规定的操作。
      头文件为:#include <signal.h>
      参数定义:signal(sig,function)
      int sig;
      void (*func) ();
      其中sig共有19个值

    这里用到了3号,即相应键盘的停止信号,ctr+(也可能是ctrl + c),和16,17号自定义信号

    • wait()函数
      父进程处于阻塞状态,等待子进程终止,其返回值为所等待子进程的进程号

    • exit()函数
      进程自我终止,释放所占资源,通知父进程可以删除自己,此时它的状态变为P_state= SZOMB,即僵死状态.如果调用进程在执行exit时其父进程正在等待它的中止,则父进程可立即得到该子进程的ID号

    流程图

    实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include<sys/wait.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    int flag_wait=1;
    
    void stop2()
    {   
        flag_wait=0;
        printf("
    son interruption
    ");
    }
    void stop()
    {
        printf("
    interruption
    ");
    }
    
    int main()
    {
        pid_t pid1,pid2;
        signal(3,stop);
    
        while((pid1=fork())==-1);
        if(pid1>0)
        {
            while((pid2=fork())==-1);
            if(pid2>0)
            {
                sleep(5);
                kill(pid1,16);
                wait(0);
                kill(pid2,17);
                wait(0);
                printf("
    Parent process is killed
    ");
                exit(0);
            }
            else
            {
                signal(17,stop2);
                while(flag_wait);
                printf("
    child process 2 is killed
    ");
                exit(0);
            }
        }
        else
        {
            signal(16,stop2);
            while(flag_wait);
            printf("
    child process 1 is killed
    ");
            exit(0);
        }
        return 0;
    }
    

    结果

    运行后若按下停止键,则

    或者5秒后自动执行

  • 相关阅读:
    自己在安装centos 系统时, 是使用英文安装 成功,现在系统语言为英语,如何设置为中文?
    【转】HTML5的语音输入 渐进使用HTML5语言识别, so easy!
    基于layer简单的弹层封装
    条码扫描仪前端驱动
    JavaScript 生成Guid函数
    数据库连接字符串
    IDatabaseInitializer<TContext>接口研究
    async与await线程分配研究
    AsyncLocal<T>与ThreadLocal<T>区别研究
    entity framework core 2.0 & sqlite 配置教程
  • 原文地址:https://www.cnblogs.com/yueshangzuo/p/8004876.html
Copyright © 2020-2023  润新知