实验6 进程间通信_第1页
实验6 进程间通信_第2页
实验6 进程间通信_第3页
实验6 进程间通信_第4页
实验6 进程间通信_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、 实验6 进程间通信一、 实验目的:通过本实验了解和掌握进程间通讯的相关知识,(1) 了解进程通信的基本原理。(2) 了解和熟悉管道通信,消息传送机制及共享存储机制。二实验内容1.进程的管道通信阅读下列程序,完成实验任务。#include<unistd.h> #include<signal.h> #include<stdio.h> int pid1,pid2;main()int fd2; char outpipe100,inpipe100;pipe(fd); /将fd装入管道中while(pid1=fork()=-1); /如果进程没有创建成功,则一直循环i

2、f(pid1=0) /如果是子进程lockf(fd1,1,0);sprintf(outpipe,"chile 1 process a message!");/将字符串读入到oupipe中去write(fd1,outpipe,50); /将outpipe写入到 fd1中sleep(5); /睡眠5秒lockf(fd1,0,0); exit(0); else /是父进程 while(pid2=fork()=-1); if(pid2 = 0) /进程创建成功,并且是子进程lockf(fd1,1,0);sprintf(outpipe,"child 2 process is

3、 sending a message!");write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewait(0); /等待进程read(fd0,inpipe,50); /将 inpipe读入fd0中去,printf("%sn",inpipe); /打印出子进程2wait(0); read(fd0,inpipe,50); printf("%sn",inpipe); /打印出子进程1exit(0);实验任务:(1),读懂上面的程序,编译执行,分析为什么会出现这样的结果。答:分别将子进程1

4、,2写入fd1中去,然后在fd0中打印出来。(2),解释程序中sleep(5)语句的作用。答:主要是起休眠作用。如果去掉的话,两条语句一下子就打印到屏幕上,没法体现管道传送的过程。实验截图如上。2.共享存储区的创建,附接合断接。使用系统调用shmget(),shmat(),shmdt()合shmct1(),编制一个长度为1kb的消息发送和接收程序。源代码如下。#include<sys/types.h>#include<sys/shm.h>#include<sys/ipc.h>#include<errno.h>#include<unistd.

5、h>#include<stdio.h>#include<stdlib.h>#define SHMKEY 75int shmid,i;int *addr;int p1,p2;CLIENT() /客户端int i;shmid =shmget(SHMKEY,1024,0777); /创建一个共享区 SHMKEY为共享区区的名字,1024字节,0777为设置的标志。addr = shmat(shmid,NULL,0); /shmat 共享存储区的附接。将一个共享区附接到一个虚拟的地址空间上。Shmid为连接共享区的标志,addr连接地址(区间), 0表示返回的地址。for

6、(i = 10;i>=1;i-)while(*addr!=-1); /如果没有连接好地址,则一直循环printf("(client)sent:%dn",i); /如果连接成功,输入i的值*addr = i; /将i的值赋给连接的地址exit(0);SERVER() /服务器shmid = shmget(SHMKEY,1024,0777|IPC_CREAT);addr=(int*)shmat(shmid,NULL,0);do*addr = -1; while(*addr = -1);printf("(server)received:%dn",(*ad

7、dr);/输出连接好的地址信息while(*addr); shmctl(shmid,IPC_RMID,0);exit(0);main()p1 = fork();if(p1)SERVER();system("ipcs -m");p2=fork();if(p2)CLIENT();实验任务:分析程序运行机制和过程,写出并分析程序运行结果。实验截图如上。3.消息的创建、发送和接收。实验任务:使用系统调用msgget()、msgsnd()、msgrcv()及msgct1()编写一个内容与2(共享存储区,如上)功能相同的程序,并分析程序运行结果。#include<stdio.h&

8、gt;#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#include<sys/wait.h>#include<string.h>#define MSGKEY 75struct msgformlong mtype;char mtext1030;msg;int msgqid,i;void CLIENT()msgqid = msgget(MSGKEY,0777);msg.mt

9、ype = 1;strcpy (msg.mtext,"hello,worldn");printf("(client)sentn");msgsnd(msgqid,&msg,1024,0);void SERVER()msgqid = msgget(MSGKEY,0777|IPC_CREAT);msgrcv(msgqid,&msg,1030,1,0);printf("(server)receiver:%sn",msg.mtext);msgctl(msgqid,IPC_RMID,0);main()system("ip

10、cs -q");if(fork()SERVER();else CLIENT();wait(0);wait(0);四、信号机制实验任务:在Linux 下编程,主进程用fork()创建两个子进程,主进程重复显示一首歌词,期间当程序收到窗口传来的kill命令信号时(如使用Ctrl + C传进来的中断信号),显示“我是机器不止九条命!”然后继续显示歌词,并向两个子进程分别发送中断信号,子进程1受到中断信号后,显示“。”,并结束运行, 子进程2收到中断信号后, 显示“。”,并结束运行, 主进程等待两个进程均结束后,输出“。”,后终止运行。#include <stdio.h>#inc

11、lude <stdlib.h>#include <signal.h>int p1,p2,i;void methodfunc() printf("n我是机器猫,我有九条命!n"); kill(p1,160); kill(p2,170);/ exit(0);void child1() printf("n我是大儿子,我生的伟大n"); exit(0);void child2() printf("n我是小儿子,我死的光荣n"); exit(0);main() p1=fork(); if(p1=0) while(1) s

12、leep(1); signal(160,child1); signal(SIGINT,child1); p2 = fork(); else p2 = fork(); if(p2=0) while(1) sleep(1); signal(170,child2); signal(SIGINT,child2); for(i=0;i<10;i+) sleep(1); printf("n一个像秋天,一个像夏天n"); signal(SIGINT,methodfunc); printf("n我是父亲,啊,伤心再见!n");五、实验心得在此次试验中,感触最深的是还是子进程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论