OS实验八: 进程间通信实验(一)

实验目的

1、了解什么是信号

2、熟悉LINUX系统中进程之间软中断通信的基本原理

实验内容

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

Child process1 is killed by parent!

Child process2 is killed by parent!

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

Parent process is killed!

实验过程

一、信号

1、信号的基本概念

每个信号都对应一个正整数常量(称为signal  number,即信号编号。定义在系统头文件<signal.h>中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。

信号机制具有以下三方面的功能:

(1)发送信号。发送信号的程序用系统调用kill( )实现;

(2)预置对信号的处理方式。接收信号的程序用signal( )来实现对处理方式的预置;

(3)收受信号的进程按事先的规定完成对相应事件的处理。

二、所涉及的中断调用

1、kill( )

系统调用格式

int  kill(pid,sig)

参数定义

int  pid,sig;

其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。

2、signal( )

预置对信号的处理方式,允许调用进程控制软中断信号。

系统调用格式

signal(sig,function)

头文件为

                 #include <signal.h>

参数定义

signal(sig,function)

int  sig;

void (*func) ( )

其中sig用于指定信号的类型,function:在该进程中的一个函数地址

三、参考程序

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void waiting( ),stop( );
int wait_mark;
main( )
{
int p1,p2,stdout;
while((p1=fork( ))= =-1);       /*创建子进程p1*/
if (p1>0)
            {
while((p2=fork( ))= =-1);     /*创建子进程p2*/
if(p2>0)
{
                    wait_mark=1;
signal(SIGINT,8。vstop);   /*SIGINT当用户从键盘按^c键或^break键时中断,转stop,*/
waiting( );
kill(p1,16);        /*向p1发软中断信号16*/
kill(p2,17);        /*向p2发软中断信号17*/
wait(0);           /*同步*/
wait(0);
printf("Parent process is killed!\n");
exit(0);
}
           else
             {
                    wait_mark=1;
signal(17,stop);   /*接收到软中断信号17,转stop*/
lockf(stdout,1,0);
printf("Child process 2 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop);        /*接收到软中断信号16,转stop*/
lockf(stdout,1,0);
printf("Child process 1 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
   }

void waiting( )
{
 while(wait_mark!=0);
}

void stop( )
{
wait_mark=0;
}

实际运行结果:
Child process1 is killed by parent!
Child process2 is killed by parent!

 四、理论运行结果 

屏幕上无反应,按下^C后,显示 

Child process1 is killed by parent!

Child process2 is killed by parent!

Parent  process  is  killed!

猜你喜欢

转载自blog.csdn.net/qq_50777680/article/details/121265714