操作系统实验报告——进程管道消息信号量共享存储区通信实验

一、实验目的

  1. 理解进程管道、消息、共享存储区和信号量通信的原理。

2.理解进程通信的原理。
3.掌握管道通信机制。
4.熟悉无名管道和有名管道通信的实现。
5.掌握信号量通信机制和共享存储区通信机制。
6.熟悉信号量的构造、信号量的通信、共享区的连接与断开、数据的发送与获取。
7.编程实现父子进程间的同步;编程实现无名管道父子进程间的通信;编程实现有名管道父子进程间通信;编程创建一个私有队列,一个进程自己发送消息和接收消息;编写程序创建一个公共消息队列,实现客户进程和服务者进程之间的通信。运行并分析各自的输出结果。对观察到的内容做详细记录分析。
8.编写程序,通过信号量实现进程互斥共享文件的使用;编写程序,实现发送进程向共享存储区发送消息,接收进程从共享存储区中读出消息;运行并分析输出结果。对观察到的内容做详细记录分析,并写出实验报告。

二.实验环境

VMware WorkstationPro

三、实验内容与步骤

  1. 理解进程管道、消息、共享存储区和信号量通信的原理。

①管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

pipe()函数。pipe()会建立管道,并将文件描述词由filedes数组返回。filedes[O]为管道的读取端,filedes[1]为管道的写入端。该函数若执行成功,则返回0,否则返回一1,错误原因存于errno中。

#include

int pipe(int filedes[2])

②消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

msgsnd()函数。该函数定义在sys/types.h文件、sys/ipc.h文件及sys/msg.h文件中,函数原形为ingmsgsnd(int msqid,struct msgbuf * msgp,int msgsz,int msgflg)。msgsnd()用来将参数msgp指定的消息送至参数msqid的消息队列内,参数msgp为msgbuf结构其定义如下:

struct msgbuf

{

long mtypei;//消息的种类,必须大于0

char mtext[i];//消息数据

}

③共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

shmget()函数。该函数定义在sys/ipc.h文件和sys/shm.h文件中,函数原形为int shmget(key_tkey,int size,int shmflg)。shmget()用来取得参数key所关联的共享内存识别代号。如果参数key为IPC_PRI-VATE,则会建立新的共享内

你可能感兴趣的:(操作系统,linux,运维,服务器)