实验5:进程间高级通信_第1页
实验5:进程间高级通信_第2页
实验5:进程间高级通信_第3页
实验5:进程间高级通信_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论