Linux操作系统实验系列之实验六进程间通信―消息

一、实验目的
1、了解什么是消息
2、熟悉消息传送的机理

二、实验内容:
消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。

程序设计
(1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。
(2)SERVER端建立一个key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个消息后显示“(server)received”。
(3)CLIENT端使用key 为75的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发出一条消息后显示“(client)sent”。
父进程在SERVER和CLIENT均退出后结束。

三、实验环境
Linux操作系统

四、实验过程与运行结果
源代码:
#include<stdio.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<stdlib.h>
#define msgkey 75

struct msgform
{
long msgtype;
char msgtext[1000];
}msg;

int msgqid,i;

void cilent(){
int i;
msgqid=msgget(msgkey,0777);
for(i=10;i>=1;i–){
msg.msgtype=i;
printf("(cilent)send\n");
msgsnd(msgqid,&msg,1000,0);
}
exit(0);
}

void server(){
msgqid=msgget(msgkey,0777|IPC_CREAT);
do{
msgrcv(msgqid,&msg,1000,0,0);
printf("(server) received\n");
msgsnd(msgqid,&msg,sizeof(int),0);
}while(msg.msgtype!=1);
msgctl(msgqid,IPC_RMID,0);
exit(0);
}

main(){
while((i=fork())-1);
if(!i) server();
while((i=fork())
-1);
if(!i) cilent();
wait(0);
wait(0);
}

结果图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43372169/article/details/110521821
今日推荐