Linux第五个实验报告

一木 332 views 0

实验五: 基于消息队列和共享内存的进程间通信

实验目标

  • Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉:
  • Linux支持的消息通信机制及其使用方法
  • Linux系统的共享存储区的原理及使用方法。

实验内容

  • 【实验5-1】消息的创建、发送和接收
  • 【实验5-2】共享内存取得创建、附接和断接

【实验5-1消息的创建、发送和接收

知识点回顾

  • 消息队列的创建、发送和接收函数的使用

功能描述

使用消息调用msgget()、msgsnd()、msggrev()、msgctrl()编制长度为1K的消息的发送和接收程序。

实验步骤

1:消息队列的创建

头文件:#include <sys/msg.h>

指令:int msgget(key_t key, int msgflg)

2:定义结构体,用于存储消息

typedef struct _msg

{

long mtype;/*消息类型*/

char mtext[100];/*消息正文*/

...      /*消息的正文可以有多个成员*/

}MSG;

3:消息队列的发送

#include<stdio.h>

#include <stdlib.h>

#include<string.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

 

typedef struct _msg //定义一个结构体,存储数据

{

long mtype;  //消息的类型

char mtext[50];//存放消息内容的数组

}MSG;

 

int main(int argc,char *argv[])

{

key_t key;

int  msgqid; //定义在发送里面的消息队列号

key = ftok(".", 2012);//ftok函数生成一个键值。也可以这样写“/home/linux” , 'a'   前面为文件路径,不存在也没事,后边只要不为0就行

msgqid = msgget(key,IPC_CREAT|0666); //创建一个消息队列,求出它的队列号,数字代表权限。

if (msgqid == -1)

{

perror("msgget");

exit(-1);

}

 

MSG msg; //定义结构体

msg.mtype = 10;

strcpy(msg.mtext, "hello world");//把这句话传入结构体中存放数据的数组中。

msgsnd(msgqid, &msg, sizeof(msg.mtext), 0);//代表发送数据

return 0;

}

4:消息队列的接收

用到函数:ssize_t msgrcv(int msqid, void *msgp, size_t

msgsz, long msgtyp, int msgflg);

 

msgrcv(msgqid, &msg, sizeof(msg.mtext), 10, 0);//接受数据   第四个参数>0返回msgtyp中的消息,这个值可以分等于0,小于0,大于0.

printf("msg.mtext=%s\n", msg.mtext);//打印出来

5销毁消息队列

用这个函数

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

 

 

msgctl(msgqid, IPC_RMID, NULL);//销毁消息队列

6:传送1K的消息

把结构体中的数组改为1024个就行了

 

 

实验现象

【实验5-2】共享存储取得创建、附接和断接

知识点回顾

  • 共享内存函数API调用

功能描述

使用系统调用shmget()、shmat()、shmctl()、shmctl(),编制一个与上述功能相同的程序。

实验步骤

1:创建或打开一个共享内存区

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget(key_t key, size_t size,int shmflg);

2:共享内存映射

void *shmat(int shmid, const void *shmaddr,

int shmflg);

2:共享内存的发送

printf("copy data to shared-memory\n"); /*拷贝数据至共享内存区*/

bzero(shmadd, BUFSZ);

strcpy(shmadd, "data in shared memory\n");

3:共享内存的读出

printf("copy data from shared-memory\n");

printf("data = [%s]\n", shmadd);

4:解除共享内存的映射

#include <sys/types.h>

#include <sys/shm.h>

int shmdt(const void *shmaddr)

5:删除共享内存

int shmctl(int shmid, int cmd,

struct shmid_ds *buf);

实验现象

见实验报告

实验报告

链接:https://pan.baidu.com/s/1Krq9d3Z9Msfh8u9IrfWQdA
提取码:0ga7
复制这段内容后打开百度网盘手机App,操作更方便哦

 

打赏
发表评论 取消回复
表情 图片 链接 代码

分享
微信
微博
QQ