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);
}
结果图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。