实验四 进程间通信(上)

一、实验名称:实验四 进程间通信(上)

二、实验日期:2014/3/20

三、实验目的:

1.   通过实验理解软中断信号机制以及如何通过软中断实现父子进程同步

2.   通过实验理解无名管道通信

四、实验的步骤和方法:

 

第四次小课进程间通信(上)

第一部分本周大课内容回顾

主要内容

1.  软中断

2.  管道通信

 

l  进程间通信根据信息量不同能划分成哪两种类型?两种类型有何区别?

进程控制(控制信息的通信,低级通信)

数据交换(大批数据的通信,高级通信)

l  OS为进程间通信提供的常用接口有哪些?Linux支持哪些机制?

接口:

软中断信号、信号量集

管道、消息队列、共享内存等

Linux支持的有:

软中断信号、管道、IPC(信号量、消息缓冲、共享内存)

 

 

软中断信号的预置函数signal()

调用格式:signal(sig,function)

说明:

sig 软中断信号的序号或名称

function 与软中断信号关联的函数名

 

l  软中断信号主要用于解决何种问题?

l  如何使用软中断信号?

l  管道的定义?无名管道的工作原理是?

 

l  无名管道能否进行双向通信?无名管道能否在任意进程间通信?

 

 

Linux软中断信号的系统调用(1)

软中断信号的预置函数signal()

调用格式:signal(sig,function)

说明:

sig 软中断信号的序号或名称

function 与软中断信号关联的函数名

 

Linux软中断信号的系统调用(2)

发送软中断信号函数kill()

调用格式:kill(pid,sig)

说明:

pid表示一个或一组进程标示符,pid值的定义如下:

 >0:将信号发送给指定的进程

 =0:将信号发送给同组的所有进程

=-1:将信号发送给所有满足如下条件的进程:进程的用户标示符等于发送信号进程的有效用户标示符

Sig为软中断信号(序号或名称)

 

Linux管道通信(1)

无名管道的创建

系统调用:int pipe(int PipeName[2]);

参数说明:

PipeName[2],管道名,为一2元整型数组

PipeName[0]专用于读进程

PipeName[1]专用于写进程

返回值:整型。0代表管道创建正确;-1代表管道创建失败。

该管道由创建进程及其子孙进程共享

使用头文件:unistd.h

 

Linux管道通信(2)

无名管道的读写系统调用

写:write(PipeName[1],buf,size);

读:read( PipeName[0],buf,size);

参数说明:

PipeName,管道名。其中[0]专用于管道的读操作,[1]专用于管道的写操作

buf,存放读或者写数据的缓冲区

size,读或者写数据的长度(字节数)

 

 

第二部分进程间通信实验

1.  软中断

2.  管道通信

实验1 软中断实验

4-1.c:编写一个程序,循环显示字符串”Hello!”,当键盘键入ctrl+c时终止循环,并显示“OK!”后结束。

 

实验1 软中断实验(4-1.c)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


分析:

 

 

结果如图所示:

 

 

 

 

 

 

 

 

 

 

 


改造:要求按3次Ctrl + C后才结束

将signal()语句和函数删除后重新编译看结果有何变化?

 

实验2 使用软中断实现父子进程同步

父进程创建子进程P1,父进程显示3行字符串;

父进程向子进程发送软中断信号,等待子进程终止后,父进程输出结束信息”OK!”,然后终止执行。

子进程循环显示”I am a child!”,接收到父进程发来的软信号后停止循环,显示”child exited!”并终止执行。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验2 软中断实验(4-2.c)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


分析:

父子父同步

 

结果如图所示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 


改造:如果把kill()函数注释掉,结果将如何?为什么?

实验3 无名管道应用

文件名4-3.c:父进程创建一个子进程和一个无名管道fd,由子进程向管道写入信息”Thisis a message!”,然后终止执行;父进程接收到子进程终止信号后从管道中读出并显示信息后结束。

注意:管道的创建、管道数据的读写

实验3 无名管道应用 (4-3.c)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


分析:

 

结果如图所示:

 

 

 

 

 

 


改造:父进程创建两个子进程P1、P2,P1向管道的写数据“PipeMessage Test”,P2从管道读数据并显示这些数据。

思考:类似这种父子进程之间的数据通信还有什么解决方案?

 

你可能感兴趣的:(OS)