版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验二进程管理进程的消息通信1 .实验目的加深对进程通信的理解,理解进程消息传递机制。掌握进程通信相关系统调用。理解系统调用和用户命令的区别。实验类型:验证型实验学时:2实验原理和知识点 实验原理:消息通信机制允许进程之间大批量交换数据。消息通信机制是以消息队列 为基础的,消息队列是消息的链表。发送进程将消息挂入接收进程的消息队列,接收进程 从消息队列中接收消息。消息队列有一个消息描述符。对消息队列的操作是通过描述符进 行的。任何进程,只要有访问权并且知道描述符,就可以访问消息队列。每个消息包括一 个正长整型的类型字段,和一个非负长度的数据。进程读或写消息时,要给出消息的类 型。若队列中使用的
2、消息类型为0,则读取队列中的第一个消息。(2)知识点:消息、消息队列实验环境(硬件环境、软件环境):硬件环境:Intel Pentium III以上CPU, 128MB以上内存,2GB以上硬盘软件环境:linux操作系统。预备知识msggetO系统调用:头文件 #include 函数原型 int msgget(key_t key, int flag);功能:创建消息队列,或返回E key对应的队列描述符。成功返回消息描述符,失败则返 回-1。参数:key是通信双方约定的队列关键字,为长整型数。口ag是访问控制命令,它的低9 位为访问权限(代表用户、组用户、其他用户的读、写、执行访问权),其它位
3、为队列建立 方式。(例:rwxrwx: 0)msgsndO系统调用:头文件 #include 函数原型 int msgsnd(int id, struct msgbuf *msgp,int size,int flag);功能:发送一个消息。成功返回0,失败返回-1。参数:id是队列描述符。msgp是用户定义的缓冲区。size是消息长度。flag是操作行 为,若(flag&IPC_NOWAIT) 真,调用进程立即返回;(flag&IPC_NOWAIT) 假, 调用进程阻塞,直乱消息被发送出去或队列描述符被删除或收到中断信弟止。缓冲区结 构定义如卜:struct msgbuf long mtype
4、; char mtext n ; ;msgrcv ()系统调用:头文件 #include 函数原型 int msgrcv(int id, struct msgbuf *msgp, int size, int type, int flag); 功能:接收一个消息。成功返回消息正文长度,失败返回参数:id是队列描述符。msgp是用户定义的缓冲区。size是要接收的消息长度。type 是消息类型,若type为0则接收队列中的第一个消息,若type为正则接收类型为type 的第一个消息。flag是操作行为,若(flag&IPC_N0WAIT)?9真,调用进程立即返回。若 (f:Lag&IPC_NOWA
5、工T)为假,调用进程睡眠,直至ll接收到消息为止。msgctlO系统调用:头文件 #include 函数原型 int msgctl (int id, int cmd, struct msgid_ds *buf);功能:查询消息队列描述符状态,或设置描述符状态,或删除描京符。成功返回0,失败 返回-L参数:id是队列描述符。cmd是命令类型,若cmd为IPC_STAT,队列id的消息队列头 结构读入buf中;若cmd为IPC_SET,把buf所指向的信息复制到id的消息队列头结构 中。若cmd为IPC_RMID,删除id的消息队列。Buf为消息队列头结构msgid_ds指针。(linux IPC
6、)7.实验内容及步骤:(1)任务描述:使用系统调用msgget 0 % msgsndO msgrcv。、msgctl (),编写消息发送和接收程 序。要求消息的长度为lKBo程序设计过程:先定义消息结构,struct msgbuf(long mtype;char mtextn;;用这个结构定义消息缓冲全局变量msg,定义消息队列描述符msgqido约定队列关 键字为7S。创建两个子进程client和servero Client使用msgget ()创建消息队列,使用 msgsnd ()发送10条消息。Server使用msgget ()获取消息队列描述符,然后用 msgrcv ()接收消息,完毕
7、后删除队列描述符。为了清楚地显示Client发送的是哪条消 息,每发送一条消息,打印消息号(消息类型),Sever每收到一条消息,也打印消息类 型。设计收发方式。Client每发送一条,Sever就接收一条。/*收发方式:Client ()每发送一条消息,Server ()就接收一条*/*此方法不能保证一定能同步。对于不同速度的机器,如果没有其他耗时的进程,可以调 整sleep的时间值而获得同步。*/ n“,i); /*打印消息类型*/msgsnd(msgqid,&msgz1024,0);/*发送消息msg到msgqid消息队列,可以先把消息正文放到中*/sleep(l) ;/*使进程挂起1秒
8、。等待接收进程接收。比较加上这一句和不加这一句 的结果*/exit (0);void Server () /*获得关键字对应的消息队列描述符*/msgqid=msgget(MSGKEY,0777|IPC_CREAT);do (msgrcv (msgqid, &msg, 1030, 0, 0) ; /* 从 msgqid 队列接收消息 msg */printf (* (server %d) received. nH, ;/* 打印消息类型 */while!=l);/*消息类型为1时,释放队列/msgctl (msgqid, IPC_RMID, 0) ;/* 删除消息队列 */exit(0);vo
9、id main() int i;while ( (i=fork() )=-l) ;/*创建子进程;如果创建失败,执行空语句*/if (! i) Server () ;/* 如果 i=0,在子进程中,运行 Server */else /*否则,在父进程中*/( while (i=fork () ) =-1) ;/* 继续创建子进程 */if (! i) Client () ;/* 如果 i=0,在子进程中,运行 Client */wait(0); /*等待子进程结束*/wait(0); /*等待子进程结束*/)注:IPC进程间通信(Inter-Process Communication)就是指多
10、个进程之间相互通信, 交换信息的方法。上机操作创建源文件,编译gcc -o msg ,运行./msg 观察屏幕,记录结果。yinjiaoYoulou ./nsg(client 10) sent.yinjiaoYoulou ./nsg(client 10) sent.(server 10)received.(client 9) senl.(server 9)receied.(client 8) sent.(server 8)receied.(client 7) sent.(server 7)recei ved.(client 6) senl.(server 6)receied.(client 5
11、) sent.(server 5)receied.(client 4) sent.(server 4)rccci ved.(client 3) sent.(server 3)receied.(client 2) sent.(server 2)receied.(client 1) sent.(server 1)rccci ved ytnjiaoYouYouy i nji oo*YouVou. /msg(client 10) sent.(client 9) sent, (client S) sent. (client 7) senl. (client 6) sent, (client 5) sen
12、t. (client 4) senl. (client 3) sent, (client 2) sent. (client ) sent. (server 】0)received.(server 9)received. (server S)received (server 7)rcccivcd. (server 6)received, (server 5)received. (server 4)rccci vcd . (server 3)received, (server 2)received, (server 】)received.yinjiaoYouVou S ,简答:程序中有,sleep
13、(l);/*使进程挂起1秒。等待接收进程接收。比较加上这一句和 不加这一句的结果*/,试分析为什么会有这样的运行结果差异。(4)课堂练习(1)修改上述程序,让Client向Server发送一个字符串The message here is just a joke.”。Server收到消息后打印出来。yi njiaoYouYou *S ./msg2(client 1) sent- (server 1)received.The nessage he re is Just a joke.参考答案:msgqid=msgget(MSGKEY,0777); /* 创建消息队列,访问权限为 777 */*指定
14、消息类型*/pirntfCCclient 1) sent.nH); /* 打印消息类型 */nisgsnd(nisgqid.&msg,strlen,O);/*发送消息nisg到msgqid消息队列,可以先把消息正文放到中,strlen*/exit(O);void Server。 /*获得关键字对应的消息队列描述符*/msgqid=msgget(MSGKEY,0777|IPC_CREAT);msgrcv(msgqid,&msg, 1024,0,0); /* 从 nisgqid 队列接收消息 msg */piintf(H(server l)received.nH); /* 打印消息类型 */pnn
15、tf(”sn”,;/*消息类型为1时,释放队列*/msgctl(nisgqid.IPC_RNIID.O);/* 删除消息队列 */exit(0);void main()( mt i;void main()( mt i;wliile(i=fork()=-1);if(!i) SeiverQ;else(wliile(i=fork()=-1);ClientQ;)wait(O);wait(O);/*创建子进程/* 子进程 Server */*创建子进程*/* 子进程 Client */*等待子进程结束*/*等待子进程结束*/(5)思考:1、进程的消息传递机制和全局变量是一个概念吗?消息是通过全局变量进行
16、传递 的吗?pnntRknd copynM); exit(O);void Server。sleep(l);prmtf(Hstar displayn);pnntf(”done!%sn”,; pnntRknd copynM); exit(O);void main()( mt i;/*创建子进程/*创建子进程/* 子进程 Server */*创建子进程*/* 子进程 Client */*等待子进程结束*/*等待子进程结束*/if(!i) SeiverQ;else(wliile(i=fork()=-1);ClientQ;)wait(O);wait(O);y i n jiaoYouYoustar cop
17、yend copystar displaydone!end displayyinjiaoYouYou S |1.在client里面改变了,但是server里面prmtf出来却什么也没有,说明全局变量不可在 进程间传递信息。pimtf(nend copynMpimtf(nend copynM);mt i;while(i=fbrk()=. 1);if(!i) Seiver();else(wliile(i=fbik()=-1);ClientQ;wait(O);wait(O);yinjiaolocalhost *13 ./msg2 star copy end copy client running s
18、tar display-done! The message he re is Just a Joke, end copyyinjiaolocalhost. 13/*创建子进程*/* 子进程 Server */*创建子进程*/* 子进程 Client */*等待子进程结束*/*等待子进程结束*/2.在主函数里面改变全局变量是可以传递消息的,因为这是父进程,seiver是子进程,子 进程继承父进程的全部代码和资源。void Client() int 1=1; /*局却变星消息关型(袤示第几条消息)V sle叩(1); /*等待拔收。比较加上这一句和不如这一句的结果V exit(0);)void S
19、erver() sleep(1);printf(ustar displaynH);p rintf(done!%snH,msg.mtext);pnntT( end dispiaynM);exit(0);)void main()while(i=fork( )=-!);if(! 1) Se rve r()while(i=fork( )=-!);if(! 1) Se rve r(); else( whLle(i=fork()=-l);printf(M0 star copyn);strepy (msg. mtext, MTtie messageprintf(M0 end copy);/*创建子送程V/*
20、 王芸程Son/Qr */here is just a joKeo.M);Client! );/* 子送程Cliont */wait(0);wait(0);)1yinjiaoYouYou S ./nisg20 star copy0 end copy0 end copystar display-done!end displayyinjiaoYouYou S3.换个位置又不行了哦,想想是为什么!有没有晕了呢!prmtf(nend copynM);Client(); /* 子进程 Client */) wait(O);/*等待子进程结束*/wait(O);/*等待子进程结束*/ ”2$ J J J E3 I isO4 ai M yinjiaowlocalhost -/msg2 star copy end copy client running! star display done! end copy yi nJtaol oca1 host简单的说,不同的进程使用的内存空间是不共用的,全局变量只是在同一个进程所占用 的内存空间中是全局变量,而其他的进程空间是根本看不到这个变量的。父子进程不共享数据空间、堆、和栈。所以不存在共享全局变量。进程间只能IPC。2、修改上述程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国塑料行业现存资源循环需求再生评估循环经济分析报告
- 2026上海复旦大学方法附属妇产科医院招聘临床研究中心科管行政人员1人备考题库(原创题)附答案详解
- 2026中国区块链加密芯片算法优化与数字货币硬件钱包安全研究
- 2026山东东营广饶县稻庄镇城镇公益性岗招聘15人考前冲刺密卷(含答案详解)
- 2026宁夏回族自治区人民医院自主招聘事业单位人员11人笔试题库及答案详解【全优】
- 2026福建泉州工商旅游学校秋季教师招聘5人笔试题库【有一套】附答案详解
- 2026中国制药行业市场竞争态势分析投资布局规划研究报告
- 2026福建宁德市智云大数据有限公司第二批市场化岗位人员招聘笔试题库含完整答案详解(历年真题)
- 2026甘肃能化金昌能源化工开发有限公司社会招聘35人笔试题库(培优B卷)附答案详解
- 2026年8月中央广播电视总台文艺节目中心招聘15人考前冲刺试卷审定版附答案详解
- 2026年公务经费报销规范专项培训试题及参考答案
- (2026年)护理不良事件报告及管理制度
- 网络传播概论(第5版)全套教学课件(完整版)
- 邮储银行保定市分行2026秋招笔试综合模拟题及答案
- 卷扬机设备维护与使用说明书
- 劳务队安全生产管理制度
- 装机安全生产管理制度
- 2025年慈善组织自查自纠报告
- 2025中远海运物流所属宁波外代新华国际货运有限公司招聘1人(浙江)笔试历年参考题库附带答案详解
- 2026华能南方分公司所属基层企业高校毕业生招聘笔试参考试题附答案解析
- 蒸汽管道安装竣工资料
评论
0/150
提交评论