typedef struct message_buffer
{
int sender;//发送者进程标识符
int size;//消息长度
char *text;//消息正文
struct message_buffer *next;//指向下一个消息缓存区的指针
};
typedef struct processcontrol_block
{
struct message_buffer *mq;//消息队列队首指针
semaphore mutex;//消息队列互斥信号量
semaphore sm;//消息队列资源信号量
};
message_buffer *a,*i,*b;
processcontrol_block *j;
void send(receiver,a)
{//receiver为接收进程标识符,a为发送进程首地址
getbuf(a.size,i);//根据a.size申请缓冲区
i.sender=a.sender;//将发送进程的内容复制到缓冲区i
i.size = a.size;//
copy(i.text,a.text);//将发送区a中的信息复制到消息缓冲区
i.text = 0;//因为缓冲区是在需要的时候才创建,所以赋值为0
getid(PCBset,receiver.j);//取得发送进程的pcb设置,j为消息缓冲队列
wait(j.mutex);//互斥访问消息队列
insert(&j.mq,i);//将i的地址放置到j中的为空的第一个缓冲单元
signal(j.mutex);//释放该消息队列的使用权
signal(j.sm);//消息队列多了一个资源
}
void receive(b)
{
j= internal name;//j为接收进程内部的标识符
wait(j.sm);//申请其中的一缓冲单元
wait(j.mutex);
remove(j.mq,i);//将消息列表的第一条消息移出;
signal(j.mutex);
b.sender = i.sender;
b.size = i.size;
copy(b.text ,i.text );//将消息缓冲区i中的信息复制到接收区b;
releasebuf(i);//释放消息缓冲区
}