



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验5:进程间高级通信1、实验目的(1)掌握如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信;(2)加深对上述通信机制的理解。2、实现设备一台装有Windows操作系统和Linux机系统的微机或服务器。3、实验方法与注意事项实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。要求每个同学登录后系统后,要在自己的家目录内容以自己(拼音)名字或学号,创建一个子目录(已有者可以不再创建)。以后所有工作都要在自己的目录内进行。建议以后的实验都在同台计算机上做,这样可以保持连续性。用户要按通常实验要认真书写实验报告。4、实验过程示例1:编写一段程序,使其用管
2、道来实现父子进程之间的进程通信。子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent”。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。#include #include #include int pid; / 定义进程变量main() int fd2; char OutPipe300, InPipe300; / 定义两个字符数组 pipe(fd); / 创建管道 while (pid = fork( ) = -1); / 如果进程创建不成功,则空循环 if (pid = 0) / 如果子进程创建成功,pid为进程号
3、lockf(fd1, 1, 0); / 锁定管道 sprintf(OutPipe, Childs PID=%dn%s,getpid(),is sending a message to parent!n); / 给Outpipe赋值 write(fd1, OutPipe, 50); / 向管道写入数据 sleep(5); / 等待读进程读出数据 lockf(fd1, 0, 0); / 解除管道的锁定 exit(0); / 结束进程 else wait(0); / 等待子进程结束 read(fd0, InPipe, 50); / 从管道中读出数据 printf(%sn, InPipe); / 显示
4、读出的数据 exit(0); / 父进程结束 运行结果:rootlocalhost # gcc -o b b.crootlocalhost # ./bChilds PID=13807is sending a message to parent!示例2:编写一段程序,使其用消息缓冲队列来实现client进程和server进程之间的通信。Server进程先建立一个关键字为SVKEY(如75)的消息队列,然后等待接收类型为REQ(如1)的消息;在收到请求消息后,它便显示字符串“serving for client”和接收到的client进程的进程标识数,表示正在为client进程服务;然后再向cli
5、ent进程发送一应答消息,该消息的类型是client进程的进程标识数,而正文则是server进程自己的标识数。Client进程则向消息队列发送类型为REQ的消息(消息的正文为自己的进程标识数)以取得sever进程的服务,并等待server进程发来的应答;然后显示字符串“receive reply from”和接收到的server进程的标识数。#include #include #include #define MSGKEY 75struct msgform long mtype; char mtext250;msg;int msgqid,pid,*pint,i;void client()msg
6、qid=msgget(MSGKEY,0777); /*打开75#消息队列*/pid=getpid();pint=(int *)msg.mtext;*pint=pid;msg.mtype=1; /*消息类型为1*/msgsnd(msgqid,&msg,sizeof(int),0); msgrcv(msgqid,&msg,250,pid,0); /*接收消息*/printf(client):receive reply from pid=%dn,*pint); /*显示server进程标识数*/exit(0);void server( ) msgqid=msgget(MSGKEY,0777|IPC_
7、CREAT); /*创建75#消息队列*/msgrcv(msgqid,&msg,250,1,0); /*接收消息*/pint=(int *)msg.mtext; /*把正文的内容传给pint,并强制转换类型*/pid=*pint; /*获得cilent进程标识数*/ printf(server):serving for client pid=%dn,pid);msg.mtype=pid; /*消息类型为client进程标识数*/*pint=getpid(); /*获取server进程标识数*/msgsnd(msgqid,&msg,sizeof(int),0); /*发送消息*/exit(0);
8、main() while(i=fork()=-1); /*创建进程1*/ if(!i)server(); while(i=fork()=-1); /*创建进程2*/ if(!i) client(); wait(0); wait(0); 运行结果:rootlocalhost # gcc -o lsj lsj.crootlocalhost # ./lsj(server):serving for client pid=26681(client):receive reply from pid=26680示例3:编写一段程序,使其用共享存储区来实现两个进程之间的进程通信。进程A创建一个长度为512字节的
9、共享内存,并显示写入该共享内在的数据;进程B将共享内存附加到自己的地址空间,并向共享内在中写入数据。#include #include #include #include#define SHMKEY 75int shmid,i; char *addr;char *argv =I LOVE YOU FOREVER;void B( ) shmid=shmget(SHMKEY,512,0777); /*打开共享存储区*/addr=shmat(shmid,0,0); /*获得共享存储区首地址*/memset(addr,0,512); /将addr的512字节设置成字符0strncpy(addr,argv0,512); /将数组argv的前512字节存入共享区addrexit(0);void A( )shmid=shmget(SHMKEY,512,0777|IPC_CREAT); /*创建共享存储区*/addr=shmat(shmid,0,0); /*获取首地址*/printf(get %s,addr);exit(0);main( ) while (i=fork( )=-1); if (!i) A(); while (i=fork( )=-1); if (!i) B(); wait(0); wait(0);运行结果:rootlocalhost # gcc -o a a.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级数学几百几十加减几百几十质量测验试题带答案
- 篮球裁判员职业形象的重要性试题及答案
- 职业形象与农作物种子繁育员考试的试题答案
- 2024年足球裁判员职业素养的核心要素试题及答案
- 无人机导航系统的执照考试试题及答案
- 2024年体育经纪人职业考试的全攻略试题及答案
- 深入探索2024篮球裁判员试题及答案
- 小学生托管机构委托协议书(2篇)
- 游泳救生员资格考试时事热点及试题答案
- 农作物种子繁育员考试中的职业道德问题试题及答案
- 针灸推拿治疗失眠的禁忌
- 学校中层干部选拔任用实施方案
- 利达消防L0188EL火灾报警控制器安装使用说明书
- 电气工程及其自动化毕业论文-基于PLC的高空作业车电控系统设计
- 河南省驻马店市部分学校2024-2025学年高三下学期3月月考地理试题(含答案)
- 2025江苏盐城市射阳县临港工业区投资限公司招聘8人高频重点模拟试卷提升(共500题附带答案详解)
- 云南省昭通市2024-2025学年七年级上学期期末地理试题(含答案)
- 2025年湖南省新华书店有限责任公司招聘笔试参考题库含答案解析
- 2025至2030年中国声音感应控制电筒数据监测研究报告
- 福格行为模型(中文版)
- DB50T 1041-2020 城镇地质安全监测规范
评论
0/150
提交评论