【虚拟机】 get 软中断通信

2020-06-10  本文已影响0人  秣禾

实验目的

1、简单了解掌握软中断通信的定义知识。

2、了解什么是信号。

3、了解Linux系统环境下进程之间软中断通信的基本原理。

实验任务

(1)使用系统调用fork()创建两个子进程
(2)再用系统调用signal()让父进程捕捉键盘上发出的中断信号Ctrl+C
(3)当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发送软中断信号
(4)子进程捕捉到软中断信号,然后分别输出下列信息后终止:
Child process 1 is killed by parent !!
Child process 2 is killed by parent !!
(5)父进程调用wait()函数等待两个子进程终止后,输入以下信息,结束进程执行:
Parent process is killed!!

实验内容

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<stdlib.h>
int wait_flag;
void stop();
int main()
{
    int pid1,pid2;
    signal(2,stop);
    pause();
    while((pid1 = fork())== -1);
    if(pid1 > 0)
    {
      while((pid2 = fork()) == -1 );
      if(pid2 > 0)
      {
        wait_flag= 1;
        sleep(5);
        kill(pid1, 16);
        kill(pid2,17);
        wait(0);
        wait(0);
        printf("\nparent process is killed!!\n");
        exit(0);
      }
      else
      {
        wait_flag= 1;
        signal(17,stop);
        printf("\nchild process 2 is killed by parent!!\n");
        exit(0);
      }
    }
    else
    {
      wait_flag= 1;
      signal(16,stop);
      printf("\nchild process 1 is killed by parent!!\n");
    }
    }
 void stop()
{
    wait_flag = 0;
}

实验结果及分析

软中断通信
1、系统调用kill(pid,sig)和signal(sig,func)被用来传递和接收软中断信号,进程号为pid的通过,signal(sig,func)捕捉到信号sig之后,执行预约的动作func,从而达到这两个进程的通信目的。
2、上述程序中,signal( )都放在一段程序的前面部位,而不是在其他接收信号处。这是因为signal( )的执行只是为进程指定信号值16或17的作用,以及分配相应的与stop( )过程链接的指针。因而,signal( )函数必须在程序前面部分执行。
3、先预设中断信号,创建子进程pid1、pid2,预设两个进程的中断信号,在按下Ctrl+C时,父进程向两个子进程发送中断信号,子进程捕捉到信号后输出相应信息,完成后终止,最后按Ctrl+C输出“parent process is killed!!”终止。
上一篇 下一篇

猜你喜欢

热点阅读