一、实验名称:实验五进程间通信(中)

二、实验日期:2014/3/27

三、实验目的:

1.  通过实验理解消息缓冲通信

2.  通过实验理解共享内存通信

3.  了解消息缓冲通信与内存共享通信之间的差异

四、实验的步骤和方法:

第五次小课进程间通信(中)

第一部分本周大课内容回顾

l  Linux的IPC机制

Linux的IPC的含义是?IPC对象有哪几种?

1.  IPC—Inter ProcessCommunication,进程间通信。

2.  Linux的IPC机制包含如下IPC对象:消息队列、共享内存、信号量集(未讲)

3.  IPC对象

Ø  每个IPC对象拥有唯一的IPC标识(ipc_ids和ipc_id)

Ø  每个IPC对象都有一个公共的ipc_perm结构,其中拥有一个唯一的key

Ø  理解IPC标识符与key的差异

Ø  理解ipc_perm结构中mode的定义

Ø  ipc_perm在Linux中为kern_ipc_perm结构

消息队列是临界资源吗?对同一个消息队列进行访问的多个发送和接收进程存在何种制约关系?

消息队列通信的缺点是?

由shmget获得的共享内存区域是属于何种类型?(选项有物理内存页面 or磁盘文件)

共享内存通信相对消息队列通信的优点是?仍存在的问题?

l  Linux消息缓冲通信

1.创建或获取消息队列标识:

int msgget(key_t key,int msgflag)

2.发送消息到指定队列:

int msgsnd(int msgid,struct msgbuf* msgp,intsize,int flag)

3.从指定队列中接收消息:

Int msgrcv(int msgid,struct msgbuf* msgp,int size,int type, int flag)

Type=0接收队列的第一个消息;>0接收类型type的第一个消息;<0接收小于或等于| type |的最低类型的第一个消息。

4.消息队列状态查询、修改或撤销队列:

int msgctl(int msgid, int cmd, struct msgid_ds*buf)

l  Linux共享内存通信

shmget(key,size,flag):创建或获取共享内存id

shmat(int shmid,char *shmaddr,int msgflg,ulong*raddr)

shmat(int shmid,int *shmaddr,int msgflg,ulong*raddr):附接到共享内存

shmdt(viraddr):切断与共享内存的连接

shmctl(int shmid,int cmd,struct shmid_ds *buf):共享内存的状态查询、修改或撤销

第二部分进程间通信实验

1.  消息缓冲通信

2.  共享内存通信

进程间通信实验(1)

l  消息缓冲通信实验

利用消息缓冲通信方式,实现消息的发送与接收。

1.  发送进程sndfile.c将要发送的消息从键盘输入,每输入一行就作为一条消息发送,用end作为结束消息

2.  接收进程rcvfile.c从消息队列逐个接收信息并显示,用 end作为结束消息

3.  设消息队列的key值为1234

目的:了解缓冲消息通信的编程实现

理解要点:

1.  my_msg结构就是msgbuf结构,需自定义

2.  msgget()、msgsnd()、msgrcv()函数的使用

3.  采用各种方式或顺序运行此二进程,观察结果

解题思路:

2个程序:Sndfile.c和Rcvfile.c

1. Sndfile.c

定义消息缓冲区数据结构(my_msg);

通过msgget()创建消息队列;

while(1){

提示用户输入消息内容;

标准输入stdin送buffer;

buffer中的内容复制到消息缓冲;

通过msgsnd()发送消息;

消息为”end”结束;

}

2. Rcvfile.c

定义消息缓冲区数据结构(my_msg);

通过msgget()获取消息队列;

while(1){

通过msgrcv()接收消息内容;

显示消息;

消息为”end”结束;

}

Rcvfile.c

#include#include#include#include#include#include#define MAXMSG 512

struct my_msg //定义消息缓冲区数据结构

{

long int my_msg_type;

int i;

char some_text[MAXMSG];

} msg;

main()

{

int msgid;

msg.my_msg_type = 3;

msgid = msgget(12, 0666|IPC_CREAT); //获取消息队列, key为1234

while(1)

{

msgrcv(msgid, &msg, BUFSIZ, msg.my_msg_type, 0); //接收消息

printf("You wrote: %s and i = %d\n", msg.some_text, msg.i); //显示

if(strncmp(msg.some_text,"end",3) == 0)//消息为end则结束

break;

}

msgctl(msgid, IPC_RMID, 0); //删除消息队列

exit(0);

}

Rcvfile.c

#include#include#include#include#include#include#define MAXMSG 512

struct my_msg //定义消息缓冲区数据结构

{

long int my_msg_type;

int i;

char some_text[MAXMSG];

} msg;

main()

{

int msgid;

msg.my_msg_type = 3;

msgid = msgget(12, 0666|IPC_CREAT); //获取消息队列, key为1234

while(1)

{

msgrcv(msgid, &msg, BUFSIZ, msg.my_msg_type, 0); //接收消息

printf("You wrote: %s and i = %d\n", msg.some_text, msg.i); //显示

if(strncmp(msg.some_text,"end",3) == 0)//消息为end则结束

break;

}

msgctl(msgid, IPC_RMID, 0); //删除消息队列

exit(0);

}

改造:

1.  尝试使用发送与接收中的key值不一样或者设为0,看看是怎样的结果。

进程间通信实验(2)

l 共享内存通信实验(sndshm.c和rcvshm.c)

利用共享内存的方式,实现前一实验的基本目标

目的:了解共享内存通信

理解要点:

shmget()、shmat()、shmdt()、shmctl()的使用

理解消息缓冲通信与共享内存通信之间的差异

解题思路:

2个程序:Sndshm.c和Rcvshm.c

Sndshm.c

通过shmget()创建共享内存;

通过shmat()附接到近处虚拟地址空间;

while(1){

提示用户输入消息内容;

标准输入stdin送buffer;

buffer中的内容追加到共享内存;

消息为”end”结束;

}

Sndshm.c

#include#include#include#include#include#includemain()

{

int shmid;

char *viraddr;

char buffer[BUFSIZ];

shmid = shmget(1234, BUFSIZ, 0666|IPC_CREAT); //创建共享内存

viraddr = (char*)shmat(shmid, 0, 0); //附接到共享内存

while(1)

{

puts("Enter some text:"); //提示用户输入信息

fgets(buffer, BUFSIZ, stdin); //将标准输入送入到缓冲区中

strcat(viraddr, buffer);//采用追加方式写到共享内存

if(strncmp(buffer,"end",3) == 0)//当输入的字符串为end时,终止循环

break;

}

shmdt(viraddr); //切断与共享内存的链接

exit(0);

}

Rcvshm.c

通过shmget()创建共享内存;

通过shmat()附接到近处虚拟地址空间;

显示消息;

通过shmdt()断开附接;

通过shmctl()撤销共享内存;

Rcvshm.c

#include#include#include#include#include#includemain()

{

int shmid;

char *viraddr;

shmid = shmget(1234, BUFSIZ, 0666|IPC_CREAT); //创建共享内存

viraddr = (char *)shmat(shmid, 0, 0); //附接到共享内存

printf("Your message is: %S", viraddr); //输出共享内存的内容

shmdt(viraddr); //切断与共享内存的链接

shmctl(shmid, IPC_RMID, 0); //释放共享内存

exit(0);

}

linux实验五 信号应用,实验五 进程间通信(中)相关推荐

  1. matlab信号频率分析实验报告,信号抽样实验报告

    大连理工大学实验报告 学院(系): 专业: 班级: 姓 名: 学号: 组: ___ 实验时间: 实验室: 实验台: 指导教师签字: 成绩: 实验三 信号抽样 一.实验目的 1 学会运用MATLAB 完 ...

  2. 【正点原子Linux连载】第四十五章 pinctrl和gpio子系统实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. linux内存实验,LINUX编程-实验五 内存管理实验

    实验五内存管理实验 1.目的要求 (1)学习使用内存管理库函数. (2)学习分析.改正内存错误. 2.实验内容 (1)内存库函数实验 ●malloc函数 原型:extern void *malloc( ...

  4. linux实验五编程淮海工学院,实验一-LinuxC编程工具GCC和GDB.doc

    实验一-LinuxC编程工具GCC和GDB 淮海工学院计算机工程学院实验报告书 课程名: <Linux程序设计> 题 目: 实验一 Linux C编程工具:GCC和GDB 班 级: 软件1 ...

  5. 大学模电实验合集丨实验五 负反馈放大电路

    目录 一.实验目的 二.实验仪器 三.实验要求 四.实验内容及步骤 1.负反馈放大器开环和闭环放大倍数的测试 2.负反馈对失真的改善作用 3.测放大电路频率特性 五.根据实验报告回答下列问题 一.实验 ...

  6. 实验五 微控制器实验

    系列文章目录 目录 系列文章目录 一.实验目的 二.实验原理 三.微程序控制电路与微指令格式 四.实验接线 五.实验步骤 ①写微程序 ②读微程序 ③单步运行 ④连续运行 六.实验结论 一.实验目的 1 ...

  7. sdut-3332 数据结构实验之栈与队列五:下一较大值(一)

    数据结构实验之栈与队列五:下一较大值(一) Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Desc ...

  8. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  9. 20145308刘昊阳 20145302张薇《信息安全系统设计基础》实验五:网络通信 实验报告...

    20145308刘昊阳 20145302张薇 <信息安全系统设计基础>实验五:网络通信 实验报告 本次实验报告由结队伙伴书写:http://www.cnblogs.com/5302v/p/ ...

最新文章

  1. js之argument小解
  2. 基数排序python实现
  3. linux yum 本地源配置
  4. div+css 和 xhtml+css是一回事么?
  5. AOP||动态代理||AOP专业术语;
  6. php url传递参数_python+Requests接口自动化测试之传递 URL 参数
  7. pthread_attr_init线程属性
  8. java基础语句_【Java基础-Java语言基础】
  9. mysql添加一个字段(
  10. apache camel_使用Apache Camel开始使用REST服务
  11. 大功率锂电池组BMS(电池管理系统)保护板电路介绍(ACS758/CH704应用案例)
  12. Typora图片上传问题
  13. 如何只用一个软件制作大屏图表
  14. 教学打铃单片机实现(课程设计)
  15. 极限思想在计算机中的应用,高等数学中极限思想的应用
  16. android之计时器chronometer
  17. DSO(1)——DSO论文详细解读
  18. 揭秘子宫里的动物:小袋鼠仅软糖大小
  19. C++数据结构day01-链式存储
  20. driftingblues 2靶机wp

热门文章

  1. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
  2. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值
  3. SqlBulkCopy批量复制数据
  4. 无线网sdn服务器,什么是SDN,SDN网络与传统网络对比
  5. Python从数据库读取大量数据批量写入文件的方法
  6. php连接mongoDB的几个问题
  7. linux下搭建lua开发环境
  8. auto errored after 报错解决_MySQL5.7 group_by报错问题解决办法,大部分程序员都收藏了...
  9. Curl http_code 状态码
  10. 计算机安装操作系统的目的是什么,安装计算机操作系统.doc