实验七管道通信_第1页
实验七管道通信_第2页
实验七管道通信_第3页
实验七管道通信_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

1、实验 7 管道通信实验目的( 1)加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的实质;( 2)了解并熟悉 Linux 系统中利用管道实现进程通信的基本概念及方法;( 3)熟悉 Linux 提供的有关系统调用函数 /库函数,并能使用这些函数。实验准备及预习阅读讲义附件8-管道通信,了解 Linux 系统中利用管道实现进程通信的基本概念及方法,熟悉 Linux 提供的有关系统调用函数 /库函数: pipe() 、mkfifo 、close()、read()、write() 、 lockf() 。实验内容1、管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比

2、如,当在某个shell 程序( Bourneshell 或 C shell 等)键入who wc -l 后,相应 shell 程序将创建who 以及 wc 两个进程和这两个进程间的管道。考虑下面的命令行:$kill -l 显示了当前系统支持的所有信号$kill -l | grep SIGRTMIN2、函数 int pipe(int fd2) 创建一个管道,管道两端可分别用描述字fd0 以及 fd1 来描述。需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd0 表示,称其为管道读端;另一端则只能用于写,由描述字fd1 来表示,称其为管道写端。下面给出的程序使用系统调用pipe

3、() 建立一条管道线,两个子进程p1 和 p2 分别向管道各写一句话:child1 is sending a message! 和 child2 is sending a message! ,父进程则从管道中读出来自子进程的信息,并显示在屏幕上。请读懂程序并调试运行。#include #include main()int fd2;int pid1,pid2;char OutPipe100, InPipe100; pipe(fd);while(pid1=fork()=-1);if(pid1=0)printf( “child process1 %dn ”,getpid();lockf(fd1,1,

4、0);/* 加锁锁定写入端*/sprintf(OutPipe, “child1 is sending a message!”);write(fd1, OutPipe, 50);/* 将 buf中的 50 个字符写入管道 */sleep(5);/*睡眠 5秒,暂时放弃 CPU*/lockf(fd1,0,0);/* 解锁释放写入端 */exit(0);/* 结束进程 pid1 */elsewhile(pid2=fork()=-1);if(pid2=0)printf( “child process2 %dn ”,getpid() ”);lockf(fd1,1,0);sprintf(OutPipe,

5、“child2 is sending a message!”);write(fd1, OutPipe, 50);sleep(5);lockf(fd1,0,0);exit(0);elseprintf( “parent process %dn”,getpid();wait(0);read(fd0,InPipe,50);printf( “%sn”,InPipe);wait(0);read(fd0,InPipe,50);printf( “%sn”,InPipe);exit(0);3、使用管道通信时,可关闭某些不需要的读或写描述符,建立起单向的读或写管道,然后用 read 和 write 像操作文件一样

6、去操作它。下面给出的程序中子进程通过管道向父进程发送数据,这里子进程只使用到管道的写端口fd1 、父进程使用到了fd0 ,因此可关闭子进程的 fd0 和父进程的fd1 。请通过程序体会。#include#include#include#include#include#includeint main()char *msg=I am child process!;/* 子进程发送的数据*/pid_t pid;char buf100;/* 用于读取 */int pi;/* 创建管道时的返回值*/int fd2;/* 创建管道的参数 */memset(buf,0,sizeof(buf);/* 设置 b

7、uf 数组全为0,需 */pi=pipe(fd);/* 要引入 #include*/if(pi0)/*parent process*/close(fd1);/* 关闭写管道 */sleep(2);/* 休眠一下等待数据写入*/if(read(fd0,buf,100)0)/*写入管道 */printf(Message from the pipe is:%sn,buf);close(fd0);/* 关闭读管道 */waitpid(pid,NULL,0);/* 待 pid 进程退出,此处pid 为子进程 */exit(0);else perror(fork() error!); exit(0);4、

8、普通管道只能用于一个进程家族之间的通信,如父子,兄弟之间,并且普通管道在于内存中,随着进程的结束而消失;而命名管道是有“名字”的管道,存在于磁盘上,作为一个特殊的设备文件而存在, 不会随着进程结束而消失。 有名管道可用于两个无关的进程之间的通信,实现函数是 mkfifo() 。下面的程序实例演示了 mkfifo 的使用。请先以超级用户身份登录系统,然后编辑 /编译源程序(两个 *.c 程序),在图形终端上执行读程序 readfifo.c ,读程序执行后将陷入循环;切换到字符终端1( ctrl+alt+f1 ),以超级用户身份登录并执行写程序writefifo.c ,然后回到图形终端,观察读程序

9、的输出变化。/*readfifo.c*/#include#include#include#include#include#include#include#include#define FIFO /home/jkx/myfifo /*使用宏定义路径*/int main()int fd;/* 指向命名管道 */ char buf100;/* 存储数据 */if(mkfifo(FIFO,O_CREAT|O_EXCL)0) /*创建管道 */perror(Create error!n); unlink(FIFO);/* 清除管道 */ exit(0);fd=open(FIFO,O_RDONL Y|O_NONBLOCK,0);/* 打开管道 */ if(fd0)/*读取管道 */ printf(Get message:%sn,buf); else printf(Not accept any message!n);sleep(1);/* 休眠 */*/*writefifo.c*/#include#include#include#include#include#include#include#define FIFO /home/jkx/myfifo /*宏定义命名管道路径*/int main()char *msg=Som

温馨提示

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

评论

0/150

提交评论