六.实验概述
1、进程间的通信可以选择:消息队列、管道和共享内存实现。
本实验采用共享内存实现进程间的通信,共享内存通信的一个显而易见的
好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于
像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,
而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从
共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量
数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享
区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写
回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共
享内存的通信方式效率是非常高的。
2、输出井可以通过一个文件进行模拟。
3、下面是一个通过 Linux 消息队列实现的模拟假脱机打印系统。
1)消息的结构
struct msg{
long pid;//进程号
int id;//消息号
int uid;//用户号
int allpage;//总页数
int size;//页长
char name[MAX_NAME_LENGTH];//文件名
char text[MAX_MSG_SIZE];//消息内容
}
4.主要函数说明如下:
shmget 函数: 建立/获取共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
函数定义:int shmget( key_t key , int size , int shmflg );
函数说明:
如果参数 key 为 IPC_PRIVATE,则会建立新的共享内存,大小由 size 决
定。如果 key 不为 IPC_PRIVATE,也不是已建立的共享内存 IPC key,那么系
统会视参数 shmflg 是否有 IPC_CREAT 位来决定 IPC key 为参数 key 的共享内
存。如果参数包含了 IPC_CREAT 和 IPC_EXCL 位,而无法依参数 key 来建立
共享内存,则表示该共享内存已存在。此外,shmflg 也用来决定共享内存的
存取权限。
返回值:
成功返回 shmid,失败返回-1,错误存于 error 中
shmat 函数:连接共享内存
#include <sys/types.h>
#include <sys/shm.h>
函数定义: void *shmat( int shmid , const void *shmaddr , int shmflg );