写出消息缓冲通信的 send原语和receive原语。
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);//释放消息缓冲区 }