实验四 软中断信号及处理

《操作系统》实验报告

姓名

Rhyme

学号

10086

实验序号

4

实验名称

软中断信号及处理

实验目的

1.      了解Linux系统中进程软中断通信的基本原理

2.      了解并熟悉Linux系统中利用软中断信号实现进程通信的基本概念及方法

3.      熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数

实验内容

实验题目(1

1.利用sleeppausealarm函数设定闹钟,定时显示信息。题目内容

实验代码、实验过程(界面方式下的抓图)、实验结果(抓图)

阅读并运行程序并回答以下问题:

问题1:红色部分的含义是什么?此时alarm还剩下多少时间?

含义发出SIGALRM信号,还剩10s

问题2:蓝色部分的含义是什么?

挂起进程,直到捕捉到一个信号

问题3:程序的运行结果是什么,为什么运行结果中没有最后一个printf语句的输入内容?

因为进程没有被唤醒就被终止了

问题4:请在该程序上添加一个signal()函数捕捉信号,并进行信号处理,使程序显示“I have been waken up”。

#include<unistd.h>

#include<stdio.h>

#include<stdlib.h>

#include<signal.h>

int main(){

         int ret;

         alarm(50);

         sleep(30);

         ret=alarm(10);

         printf("%d\n",ret);

         signal(SIGALRM,alarm);

         pause();

    printf("I have been waken up.\n");

}

实验心得(遇到什么问题,如何解决)

看PPT和文档学习各个函数作用

实验题目(2

父进程通过kill()向子进程发送信号

实验代码、实验过程(界面方式下的抓图)、实验结果(抓图)

问题1:红色部分的含义是什么?

等待pid退出

问题2:若不添加红色程序会出现什么情况?

主进程会先于子进程结束

实验心得(遇到什么问题,如何解决)

实验题目(3

3.编制一段程序,使其实现进程的软中断通信。

实验代码、实验过程(界面方式下的抓图)、实验结果(抓图)

要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl-c键);当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:

Child process 1 is killed by parent!

Child process 2 is killed by parent!

父进程等待两个子进程终止后,输出如下的信息后终止:

Parent process is killed!

#include <unistd.h>

#include <stdio.h>

#include <signal.h>

void waiting();

void stop();

void keep_alive();

int wait_mark;

int main(){

    int p1,p2;

         while((p1=fork())==-1);

         if(p1>0){

                 while((p2=fork())==-1);

                 if(p2>0){

                          printf("parent\n");

                          wait_mark=1;

                          signal(SIGINT, stop); 

                          waiting();

                          kill(p1, SIGINT);

                          kill(p2, SIGINT);

                          wait(0);

                          wait(0);

                          printf("parent process is killed children and exit!\n");

                          exit(0);

                 }else{

                          printf("p2\n");

                          //wait_mark=1;

                          signal(SIGINT, keep_alive);

                          pause();

                          printf("child process2 is killed by parent!\n");

                          exit(0);

             }

         }else{

                 printf("p1\n");

                 //wait_mark=1;

                 signal(SIGINT, keep_alive);

                 pause();

                 printf("child process1 is killed by parent!\n");

                 exit(0);

    }

}

void waiting(){

    while(wait_mark!=0);

}

void stop(){

    wait_mark=0;

}

void keep_alive(){

}

阅读并运行程序并回答以下问题:

问题1:红色部分的含义是什么?

接收Ctrl+C

问题2:程序的运行结果是什么?

实验心得(遇到什么问题,如何解决)

猜你喜欢

转载自blog.csdn.net/qq_54499870/article/details/127987214