




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验七 管道通信w实验目的实验目的加深对进程概念的理解,明确进程和程序的区别、进一步认识并发执行的实质了解并熟悉Linux系统中利用管道实现进程通信的基本概念及方法熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数w实验准备及预习实验准备及预习阅读讲义附件8-管道通信,了解Linux系统中利用管道实现进程通信的基本概念及方法熟悉Linux提供的有关系统调用函数/库函数:pipe()、mkfifo、close()、read()、write()、lockf() w管道是Linux支持的最初Unix IPC形式之一,也是一种使用非常频繁的通信机制w逻辑上被看作管道文件,只存在于内存中w管
2、道是单向的、先进先出的、无结构的、固定大小的字节流,把一个进程的标准输出和另一个进程的标准输入连接在一起w写进程在管道的尾端写入数据,读进程在管道的首端读出数据w数据读出后将从管道中移走,其它读进程都不能再读到这些数据w管道提供了简单的流控制机制进程试图读空管道时,在有数据写入管道前,进程将一直阻塞管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞管道克服使用文件通信的两个问题w限制管道的大小管道是一个固定大小的缓冲区Linux中,该缓冲区的大小为1页,即4K字节,因此不像文件那样不加检验地增长写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默
3、认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写 w读取进程可能工作得比写进程快当所有当前进程数据已被读取时,管道变空随后的read()调用将默认地被阻塞,等待某些数据被写入例例1:管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比如,当在某个shell程序(Bourneshell或C shell等)键入whowc -l后,相应shell程序将创建who以及wc两个进程和这两个进程间的管道。考虑下面的命令行:w$kill -l 显示当前系统支持的所有信号w$kill -l | grep SIGRTMIN #include int pipe(int
4、 fd2)功能:创建一个管道,管道两端可分别用描述字fd0以及fd1来描述注意管道的两端是固定任务的,一端只能用于读,由描述字fd0表示,称为管道读端;另一端则只能用于写,由描述字fd1来表示,称为管道写端如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生一般文件的I/O函数都可以用于管道,如close、read、write等等管道的创建例例2:使用系统调用pipe()建立一条管道线,两个子进程p1和p2分别向管道各写一句话:child1 is sending a message!和child2 is sending a message!,父进程则从管道中读出来自子进程的信息,
5、并显示在屏幕上。 #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,0); /*加锁锁定写入端*/sprintf(OutPipe, “child1 is sending a message!”);write(fd1, OutPipe, 50);/*将buf中的50个字符写入管道*/sleep(5);/*睡眠5秒,暂时放弃
6、CPU*/lockf(fd1,0,0);/*解锁释放写入端*/exit(0);/*结束进程pid1 */else/ else if pid1while(pid2=fork()=-1);if(pid2=0)printf(“child process2 %dn”,getpid()”);lockf(fd1,1,0);sprintf(OutPipe, “child2 is sending a message!”);write(fd1, OutPipe, 50);sleep(5);lockf(fd1,0,0);exit(0);else /*else if pid2*/printf(“parent pro
7、cess %dn”,getpid();wait(0);read(fd0,InPipe,50);printf(“%sn”,InPipe);wait(0);read(fd0,InPipe,50);printf(“%sn”,InPipe);exit(0);/*end if pid2*/*end if pid1*/w使用管道通信时,可关闭某些不需要的读或写描述符,建立起单向的读或写管道,然后用read和write像操作文件一样去操作它:close(pipe_fd0);/*关闭读管道*/ close(pipe_fd1);/*关闭写管道*/发送进程利用文件系统的系统调用write( fd1, buf, s
8、ize),把buf中长度为size字节的字符消息送入管道入口(即写入端)fd1接收进程则使用系统调用read( fd0, buf, size )从管道出口(即读出端)fd0读出size字节的字符消息放到buf中例例3:两个进程,如子进程向父进程发送数据,即使用子进程的fd1和父进程的fd0,同时关闭子进程的fd0和父进程的fd1#include #include #include #include #include #include int main() char *msg=I am child process!; /*子进程发送的数据*/ pid_t pid; char buf100;/*用
9、于读取*/ int pi;/*创建管道时的返回值*/ int fd2;/*创建管道的参数*/ memset(buf,0,sizeof(buf);/*设置buf数组全为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,NUL
10、L,0);/*待子进程退出*/ exit(0); else perror(fork() error!); exit(0); 管道的局限w主要局限性正体现在它的特点上只支持单向数据流只能用于具有亲缘关系的进程之间没有名字;管道的缓冲区是有限的所传送的是无格式字节流管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等多少字节算作一个消息(命令、记录)w普通管道只能用于一个进程家族之间的通信,如父子,兄弟之间w命名管道是有“名字”的管道,另外的进程可以看到并使用w普通管道在内存中,随着进程的结束而消失,命名管道在磁盘上,作为一个特殊的设备文件而存在,进程结束不
11、消失w值得注意的是,管道严格遵循先进先出(first in first out),对管道及命名管道的读总是从开始处返回数据,对它们的写则把数据添加到末尾有名管道有名管道的创建#include #include int mkfifo(const char * filmname, mode_t mode)w功能:创建一个名为filename的管道w参数:mode模式设置管道的权限,如O_CREAT、O_EXCL、O_NONBLOCK等w返回:成功0,出错返回-1 错误存储在errno中有名管道的打开w有名管道比管道多了一个open操作 int open( const char * pathname
12、,int flags, mode_t mode);w返回:若所有核查的权限都通过了检查则返回0,表示成功;只要有一个权限被禁止则返回-1指向打开文件的路径打开文件的方式一般为0w参数flags 所能使用的旗标O_RDONLY ;O_WRONLY ;O_RDWR三种旗标互斥,但可与下列的旗标利用OR(|)组合 O_CREAT:文件不存在则自动建立文件 O_EXCL:与O_CREAT合用,检查文件是否存在O_APPEND:所写入的数据以附加方式加入到文件后 O_NONBLOCK:以不可阻塞的方式打开文件int fp=open(FIFO,O_RDWR|O_NONBLOCK,0);read(fp,bu
13、f,20);下面的实例演示了mkfifo的使用w请先以超级用户身份登录系统,然后编辑/编译源程序(两个*.c程序),在图形终端上执行读程序readfifo.c,读程序执行后将陷入循环w切换到字符终端1(ctrl+alt+f1),以超级用户身份登录并执行写程序writefifo.cw然后回到图形终端,观察读程序的输出变化#include #include #include #include #include #include #include #include #define FIFO /home/jkx/myfifo /*使用宏命名有名管道文件的路径*/ /*readfifo.c*/ int
14、main() int fd; /*指向命名管道*/ char buf100;/*存储数据*/ if(mkfifo(FIFO,O_CREAT|O_EXCL)0) /*创建管道*/ perror(Create error!n); unlink(FIFO);/*清除管道*/ exit(0); /* end if mkfifo*/ fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);/*打开管道*/ if(fd0) /*读取管道*/ printf(Get message:%sn,buf); else printf(Not accept any message!n); sleep(1);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 理财天赋测试题及答案
- 高德java面试题及答案
- 航运知识考试题及答案
- 环境工程风险评估与管理试题集汇编
- 未来西方政治制度与非正式政治活动试题及答案
- 学习方法多样化2025年信息系统项目管理师试题及答案
- 软件测试专家技能要求试题及答案
- 西方国家选举制度的未来趋势试题及答案
- 软件设计师考试情商提升及试题答案
- 软件测试工程师日常工作试题及答案
- 2025年互联网营销师(直播销售员)考试题库
- 2023年上海市高考语文卷试题真题及答案详解(精校打印)
- 2024《整治形式主义为基层减负若干规定》全文课件
- 2024年贵州省粮食储备集团有限公司招聘笔试参考题库附带答案详解
- 2024-2025北京中考英语真题阅读CD篇
- 社区工作联系函700字
- 供应商服务商管理办法
- 天然气管道运输外文文献
- 新教材 人教B版高中数学必修第四册 第十一章 立体几何初步 精品教学案(知识点考点汇总)
- 营销策划工作项目内容明细表
- 人教版六年级毕业考试卷数学讲解学习
评论
0/150
提交评论