操作系统课程设计-Linux 进程间通信

发布时间:2024年01月17日

目录

?

前言

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.2 实验2-2步骤2

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);
}

文章来源:https://blog.csdn.net/qq_63306482/article/details/135661189
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。