收藏 分销(赏)

第九章 管道.ppt

上传人:xrp****65 文档编号:13090825 上传时间:2026-01-14 格式:PPT 页数:21 大小:185.50KB 下载积分:10 金币
下载 相关 举报
第九章 管道.ppt_第1页
第1页 / 共21页
第九章 管道.ppt_第2页
第2页 / 共21页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,管道,进程间通信概述,无名管道,命名管道,进程间通信,进程间通信,(,IPC:Inter,Processes Communication),进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源(例如打开的文件描述符)。,进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信。,进程间通信功能:,数据传输:一个进程需要将它的数据发送给另一个进程。,资源共享:多个进程之间共享同样的资源。,通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。,进程控制:有些进程希望完全控制另一个进程的执行(如,Debug,进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。,无名管道,管道,(pipe),又称无名管道。,无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。,管道是最古老的,UNIX IPC,方式,其特点是,:,1,、半双工,数据在同一时刻只能在一个方向上流动。,2,、数据只能从管道的一端写入,从另一端读出。,3,、写入管道中的数据遵循先入先出的规则。,4,、管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。,5,、管道不是普通的文件,不属于某个文件系统,其只存在于内存中。,6,、管道在内存中对应一个缓冲区。不同的系统其大小不一定相同。,7,、从管道读数据是一次性操作,数据一旦被读走,它就从管道中被抛弃,释放空间以便写更多的数据。,8,、管道没有名字,只能在具有公共祖先的进程之间使用。,Pipe,函数,#include,int,pipe(int,filedes2);,功能:经由参数,filedes,返回两个文件描述符,参数:,filedes,为,int,型数组的首地址,其存放了管道的文件描述符,fd0,、,fd1,。,filedes0,为读而打开,,filedes1,为写而打开管道,,filedes0,的输出是,filedes1,的输入。,返回值:,成功:返回,0,失败:返回,-1,父子进程通过管道实现数据的传输,01_pipe_1.c,子进程写入管道 父进程从管道中读取,从管道中读数据的特点,1,、默认用,read,函数从管道中读数据是阻塞的。,2,、调用,write,函数向管道里写数据,当缓冲区已满时,write,也会阻塞。,3,、编程时可通过,fcntl,函数设置文件的阻塞特性。,设置为阻塞:,fcntl(fd,F_SETFL,0);,设置为非阻塞:,fcntl(fd,F_SETFL,O_NONBLOCK);,01_pipe_2.c,带阻塞和不带阻塞,文件描述符概述,文件描述符是非负整数,是文件的标识。,用户使用文件描述符(,file descriptor,)来访问文件。,利用,open,打开一个文件时,内核会返回一个文件描述符。,每个进程都有一张文件描述符的表,进程刚被创建时,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符,0,、,1,、,2,记录在表中。,在进程中打开其他文件时,系统会返回文件描述符表中最小可用的文件描述符,并将此文件描述符记录在表中。,注意:,Linux,中一个进程最多只能打开,NR_OPEN_DEFAULT,(即,1024,)个文件,故当文件不再使用时应及时调用,close,函数关闭文件。,练习,题目,:,实现,ls,-help|more,功能,提示:,ls,-help,是个外部命令,它向标准输出打印,ls,的帮助文档。,more,是个外部命令,它默认是从标准输入中获取输入,并分屏显示到屏幕上。,在使用,shell,命令时,可使用管道“”将两个命令连接起来。,用管道“”将两个命令连接后:,提示:,创建一个管道以便让,ls,-help,的输出和,more,的输入可以联系起来。,子进程,exec,执行,ls,-help,命令之前重定向“标准输出”到“管道写端”。,父进程,exec,执行,more,命令之前重定向“标准输入”到“管道读端”。,命名管道,命名管道,(FIFO),和管道,(pipe),基本相同,但也有一些显著的不同,其特点是,:,1,、半双工,数据在同一时刻只能在一个方向上流动。,2,、写入,FIFO,中的数据遵循先入先出的规则。,3,、,FIFO,所传送的数据是无格式的,这要求,FIFO,的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。,4,、,FIFO,在文件系统中作为一个特殊的文件而存在,但,FIFO,中的内容却存放在内存中。,5,、管道在内存中对应一个缓冲区。不同的系统其大小不一定相同。,6,、从,FIFO,读数据是一次性操作,数据一旦被读,它就从,FIFO,中被抛弃,释放空间以便写更多的数据。,7,、当使用,FIFO,的进程退出后,,FIFO,文件将继续保存在文件系统中以便以后使用。,8,、,FIFO,有名字,不相关的进程可以通过打开命名管道进行通信。,FIFO,文件的创建,#include,#include,int,mkfifo,(const char*pathname,mode_t,mode);,参数:,pathname,:,FIFO,的路径名,+,文件名。,mode,:,mode_t,类型的权限描述符。,返回值:,成功:返回,0,失败:如果文件已经存在,则会出错且返回,-1,。,有名管道,操作,FIFO,文件时的特点,系统调用的,I/O,函数都可以作用于,FIFO,,如,open,、,close,、,read,、,write,等。,打开,FIFO,时,非阻塞标志,(O_NONBLOCK),产生下列影响,:,特点一:,不指定,O_NONBLOCK(,即,open,没有位或,O_NONBLOCK),1,、,open,以只读方式打开,FIFO,时,要阻塞到某个进程为写而打开此,FIFO,2,、,open,以只写方式打开,FIFO,时,要阻塞到某个进程为读而打开此,FIFO,。,3,、,open,以只读、只写方式打开,FIFO,时会阻塞,调用,read,函数从,FIFO,里读数据时,read,也会阻塞。,4,、通信过程中若写进程先退出了,则调用,read,函数从,FIFO,里读数据时不阻塞;若写进程又重新运行,则调用,read,函数从,FIFO,里读数据时又恢复阻塞。,5,、通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会(收到,SIGPIPE,信号)退出。,6,、调用,write,函数向,FIFO,里写数据,当缓冲区已满时,write,也会阻塞。,02_fifo_read_1.c,从管道中读取,02_fifo_write_1.c,写入管道,练习,题目:实现单机,QQ,聊天,提示:,父进程创建子进程,实现多任务。,父进程负责发信息,(,向,FIFO,里写数据,),,子进程负责接收信息,(,从,FIFO,里读数据,),。,打开命名管道的用阻塞的方法打开。,QQ,聊天框架及流程图,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服