实验三 进程通信 实验报告

北京联合大学 信息学院

“操作系统”课程

实验报告

称:      实验三  进程间通信        

姓名(学号):        

       业:        计算机科学与技术        

间:         201052        

师:                       

北京联合大学-信息学院编制


(一)信号机制实验

1信号机制实验

1.1 题目描述

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

Child process1 is killed by parent!

Child process2 is killed by parent!

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

Parent process is killed!

2、分析利用软中断通信实现进程同步的机理

1.2 实验目标和意义

1、了解什么是信号

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

2 实验原理和实验设备

所涉及的中断调用

1kill( )

系统调用格式

int  kill(pid,sig)

参数定义

int  pid,sig;

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

(1)pid>0时,核心将信号发送给进程pid。

(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。

(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。

2signal( )

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

系统调用格式

signal(sig,function)

头文件为

                   #include <signal.h>

参数定义

signal(sig,function)

int  sig;

void (*func) ( )

其中sig用于指定信号的类型,sig为0则表示没有收到任何信号,余者如下表:

   

function:在该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGKILL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。

function 的解释如下:

(1)function=1时,进程对sig类信号不予理睬,亦即屏蔽了该类信号;

(2)function=0时,缺省值,进程在收到sig信号后应终止自己;

(3)function为非0,非1类整数时,function的值即作为信号处理程序的指针。

3实验步骤

3.1 实验步骤(方案)

参考程序

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

void waiting( ),stop( );

int wait_mar

k;

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,stop);   /*接收到^c信号,转stop*/

waiting( );

kill(p1,16);  3      /*向p1发软中断信号16*/

kill(p2,17);   5     /*向p2发软中断信号17*/

             kill(stdout, 7);

wait(0);           /*同步*/

wait(0);

printf("Parent process is killed!\n");

exit(0);

}

           else

             {

                    wait_mark=1;

                    signal(SIGINT,stop);

signal(17,stop);   /*接收到软中断信号17,转stop*/

waiting( );

lockf(stdout,1,0);

printf("Child process 2 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

}

else

{

wait_mark=1;

signal(SIGINT,stop);

signal(16,stop);        /*接收到软中断信号16,转stop*/

waiting( );

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;

}

运行结果

图1

修改之后

图2

图3

屏幕上无反应,按下^C后,显示  Parent  process  is  killed!

分析原因

上述程序中,signal( )都放在一段程序的前面部位,而不是在其他接收信号处。这是因为signal( )的执行只是为进程指定信号值16或17的作用,以及分配相应的与stop( )过程链接的指针。因而,signal( )函数必须在程序前面部分执行。

本方法通信效率低,当通信数据量较大时一般不用此法。

六、思考

1、该程序段前面部分用了两个wait(0),它们起什么作用?

2、该程序段中每个进程退出时都用了语句exit(0),为什么?

3、为何预期的结果并未显示出?

4、程序该如何修改才能得到正确结果?

图4

图5

5、不修改程序如何得到期望的输出?

5 实验小结

 

第二篇:进程通信实验报告

西安电子科技大学

《操作系统原理》实验报告

题目:进程通信

班级:×××

姓名:×××

学号:×××


一、分析和设计

1. 理论分析

多道程序设计的系统中,进程间存在着同步与互斥的关系,需要实现进程间的通信。各个进程交换信息的过程,就是进程通信的过程。

进程通信主要分为共享存储系统、消息传递系统和管道通信三大类。

管道通信是一种共享文件模式,基于文件系统,连接于两个通信进程之间,以先进先出的方

式实现消息的单向传送。

管道是一个特殊的文件,在内核中通过文件描述符表示。是一种信息流缓冲通道。

2. 总体设计

用管道实现两个进程间的通信。该管道是一个共享文件,链接父进程和子进程。发送进程以字符流的形式将信息写入管道,接受进程则在需要时从管道中读出数据。从尾部写入数据,头部读出数据。

为了协调双方的通信,该机制必须对父进程和子进程在利用管道进行通信是实施同步和互斥,并只有在确定了对方存在时才能进行通信。

三、实验结果

QQ截图未命名.png       QQ截图未命名.png

四、附录

程序

aaaaaaaaaaaaaaaaaaaa.jpg

五.心得

程序方面还是不足   整个做下来还是相当困难 ,书本知识与编程结合起来很困难, 理解方面也不够深入。。总的来说还是不够的,接下来要好好努力。

相关推荐