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