目录
前言
1 实验题目
2 实验目的
3 实验内容
3.1 步骤
3.2 关键代码
3.2.1 Server和Client的创建
3.2.2 Server核心代码
3.2.3 Server核心代码
4 实验结果与分析
5 代码
前言
本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是Ubuntu 22.04 LTS,代码均是在终端进行编译的,不会的可以先了解怎么用终端编程,或者利用其他较为智能的开发环境进行编程
1 实验题目
实验三 Linux进程间通信
2 实验目的
Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据,通过本实验,理解熟悉 Linux 支持的消息通信机制。
3 实验内容
3.1 步骤
(1)步骤1:为了便于操作和观察结果,用一个程序作为“引子”,先后 fork()两个子进程SERVER和CLIENT,进行通信。
(2)步骤2:SERVER 端建立一个 key 为 75 的消息队列,等待其他进程发来的消息。当遇到类型为 1 的消息,则作为结束信号,取消该队列,并退出 SERVER。SERVER 每接收到一个消息后显示一句“(server) received”。
(3)步骤3:CLIENT 端使用 key 为 75 的消息队列,先后发送类型从 10 到 1 的消息,然后退出。 最后的一个消息,即是 SERVER 端需要的结束信号。CLIENT 每发送一条消息后显示一句“(client)sent”。
(4)步骤4:父进程在SERVER和CLIENT均退出后结束。
3.2 关键代码
3.2.1 Server和Client的创建
while((i=fork())==-1);
if(!i) SERVER();
while((i=fork())==-1);
if(!i) CLIENT();
3.2.2 Server核心代码
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
do{
msgrcv(msgqid,&msg,1030,0,0);
printf("(Server) recieved %d\n",msg.mtype);
} while(msg.mtype!=1);
msgctl(msgqid,IPC_RMID,0);
3.2.3 Server核心代码
int i;
msgqid=msgget(MSGKEY,0777);
for (i=10;i>=1;i--)
{
msg.mtype=i;
printf("(client) sent %d\n",i);
msgsnd(msgqid,&msg,1024,0);
}
4 实验结果与分析
在终端执行程序后,会看到当Client输出完之后才会有Server的输出,与理论上的一个Client输出对应一个Server接收不相符合,这进一步说明在多进程的情况下,程序的执行结果不可预测。其结果如下图所示:
图1.1 Server和Client的通信
5 代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSGKEY 75
struct msgform {
long mtype;
char mtext[1030];
} msg;
int msgqid,i;
void CLIENT() {
int i;
msgqid=msgget(MSGKEY,0777);
for (i=10; i>=1; i--) {
msg.mtype=i;
printf("(client) sent %d\n",i);
msgsnd(msgqid,&msg,1024,0);
}
exit(0);
}
void SERVER() {
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
do {
msgrcv(msgqid,&msg,1030,0,0);
printf("(Server) recieved %d\n",msg.mtype);
} while(msg.mtype!=1);
msgctl(msgqid,IPC_RMID,0);
exit(0);
}
void main() {
while((i=fork())==-1);
if(!i) SERVER();
while((i=fork())==-1);
if(!i) CLIENT();
wait(0);
wait(0);
}