进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是"公共场所",所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过"注册表"或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作"进程间通信"。
进程间通信管道
普通的Linux shell都允许重定向,而重定向使用的就是管道。例如:
$ ls | pr | lpr
把命令ls(列出目录中的文件)的输出通过管道连接到命令pr的标准输入上进行分页。最后,命令pr的标准输出通过管道连接到命令lpr的标准输入上,从而在缺省打印机上打印出结果。进程感觉不到这种重定向,它们和平常一样地工作。正是shell建立了进程之间的临时管道。
管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。
传统上有很多种实现管道的方法,如利用文件系统、利用套接字(sockets)、利用流等。在Linux中,使用两个file数据结构来实现管道。这两个file数据结构中的f_inode(f_dentry)指针指向同一个临时创建的VFS I节点,而该VFS I节点本身又指向内存中的一个物理页,如图5.1所示。两个file数据结构中的f_op指针指向不同的文件操作例程向量表:一个用于向管道中写,另一个用于从管道中读。这种实现方法掩盖了底层实现的差异,从进程的角度来看,读写管道的系统调用和读写普通文件的普通系统调用没什么不同。当写进程向管道中写时,字节被拷贝到了共享数据页,当读进程从管道中读时,字节被从共享页中拷贝出来。Linux必须同步对于管道的存取,必须保证管道的写和读步调一致。Linux使用锁、等待队列和信号(locks,wait queues and signals)来实现同步。
右图 --管道示意图所示
参见include/linux/inode_fs.h
当写进程向管道写的时候,它使用标准的write库函数。这些库函数(read、write等)要求传递一个文件描述符作为参数。文件描述符是该文件对应的file数据结构在进程的file数据结构数组中的索引,每一个都表示一个打开的文件,在这种情况下,是打开的管道。Linux系统调用使用描述这个管道的file数据结构中f_op所指的write例程,该write例程使用表示管道的VFS I 节点中存放的信息,来管理写请求。如果共享数据页中有足够的空间能把所有的字节都写到管道中,而且管道没有被读进程锁定,则Linux就在管道上为写进程加锁,并把字节从进程的地址空间拷贝到共享数据页。如果管道被读进程锁定或者共享数据页中没有足够的空间,则当前进程被迫睡眠,它被挂在管道I节点的等待队列中等待,而后调用调度程序,让另外一个进程运行。睡眠的写进程是可以中断的(interruptible),所以它可以接收信号。当管道中有了足够的空间可以写数据,或者当锁定解除时,写进程就会被读进程唤醒。当数据写完之后,管道的VFS I 节点上的锁定解除,在管道I节点的等待队列中等待的所有读进程都会被唤醒。
参见fs/pipe.c pipe_write()
从管道中读取数据和写数据非常相似。Linux允许进程无阻塞地读文件或管道(依赖于它们打开文件或者管道的模式),这时,如果没有数据可读或者管道被锁定,系统调用会返回一个错误。这意味着进程会继续运行。另一种方式是阻塞读,即进程在管道I节点的等待队列中等待,直到写进程完成。
如果所有的进程都完成了它们的管道操作,则管道的I节点和相应的共享数据页会被废弃。
参见fs/pipe.c pipe_read()
Linux也支持命名管道(也叫FIFO,因为管道工作在先入先出的原则下,第一个写入管道的数据也是第一个被读出的数据)。与管道不同,FIFO不是临时的对象,它们是文件系统中真正的实体,可以用mkfifo命令创建。只要有合适的访问权限,进程就可以使用FIFO。FIFO的打开方式和管道稍微不同。一个管道(它的两个file数据结构、VFS I节点和共享数据页)是一次性创建的,而FIFO已经存在,可以由它的用户打开和关闭。Linux必须处理在写进程打开FIFO之前读进程对它的打开,也必须处理在写进程写数据之前读进程对管道的读。除此以外,FIFO几乎和管道的处理完全一样,而且它们使用一样的数据结构和操作。
从IPC的角度看,管道提供了从一个进程向另一个进程传输数据的有效方法。但是,管道有一些固有的局限性:
l 因为读数据的同时也将数据从管道移去,因此,管道不能用来对多个接收者广播数据。
l 管道中的数据被当作字节流,因此无法识别信息的边界。
l 如果一个管道有多个读进程,那么写进程不能发送数据到指定的读进程。同样,如果有多个写进程,那么没有办法判断是它们中那一个发送的数据。
首先上网找到进程扫把软件,然后下载到电脑,安装好就可以用了。 一款系统残留进程清理软件 进程扫把是一款系统残留进程清理...
进程扫把还可以对系统进程进行监测,自动监测系统进程的变化,一旦发现有新的软件启动或者退出,就会对内存进行一次清理,最大限度的发挥了内存扫把的清理效果。并且还有清理内存和剪贴板的热键,可以使您随时方便的...
万能扫把价格120--230元,万能扫把:欧洲、亚洲以及世界上的大部分地区,广泛应用一种用高粱秆做的扫把。美国总统富兰克林为了发展农业提倡种高粱,于是,高粱的栽植遍及美国。有一天,哈得里的一个老农夫需...
《操作系统原理与 Linux》 课程设计报告 专 业 计算机科学与技术 班 级 学 号 姓 名 指导教师 完成时间 2012年 9月 14日 成 绩 操作系统课程设计 一、设计题目 进程间通信模拟 二、设计目的 通过该题目的设计过程,了解了进程通讯的两种方式,管道通信以及消息通 信。熟悉操作系统支持的进程通信方式 三、设计要求 (1)要求实现管道通信与消息通信两种方式. (2)要求界面简单,易懂,关键代码部分要注释. (3)编程语言可以采用自己任意精通的语言 四、设计思想说明 创建一个内存共享区,实现消息管道的进程间通讯。 五、系统结构的说明 本程序是采用 MFC 框架所编写的 win32应用程序 采用 C++语言。 六、数据结构的说明 管道通信定义了一个结构体,存放管道基础信息: struct PipeStruct// 定义管道基础信息 { int UseProCount;// 当
进程间通信作为操作系统中最重要的原语之一,提供了在多个隔离的进程之间相互通信交流的可能性.提出了一种适用于微内核操作系统的进程间通信系统,并在具体的Minix操作系统平台之上予以实现,解决了Minix系统中由于进程间通信模块的缺失而导致开发人员无法顺利移植其他平台的实用程序的问题。实验数据表明,该进程间通信系统具有高效的特点;同时由于该系统的设计原则,它保持着易扩展的特点。该系统的实现虽然是基于Minix平台,但该设计同样适用于其他微内核的系统,对其他操作系统具有借鉴意义。
COM是微软自1993年便提出的组件式软件平台,用来做进程间通信(Inter-process communication, IPC)以及当作组件式软件开发的平台。COM提供跟编程语言无关的方法实现一个软件对象,因此可以在其他环境中运行。COM要求软件组件必须遵照一个共同的接口,该接口与实现无关,因此可以隐藏实现属性,并且被其他对象在不知道其内部实现的情形下正确的使用。
COM并被实现于多个平台之上,并不限于Windows操作系统之上。但还是只有Windows最常使用COM,且某些功能已被目前的.NET平台取代。
《建筑智能化系统及工程应用》中介绍了Windows NT网络操作系统的原理及应用,重点讨论了Windows NT网络协议、网络边界层、进程间通信机制,及对Win32/Win16和MS"_blank" href="/item/电气信息类/5294336" data-lemmaid="5294336">电气信息类、仪器仪表以及机电类各专业本科教学使用,也可供相关工程技术人员参考。
《建筑智能化系统及工程应用》是近些年来编者从事智能建筑教学实践、科研及实际智能建筑工程项目的经验总结。考虑各院校专业基础课安排侧重点及体系结构的差异,以及教学侧重点不同,课堂的理论教学学时少,教学内容多,又要加强工程实践环节的需要,因此,在教材处理上,各章节安排相对独立,但又注意相对完整性、系统性,使之通俗易懂便于自学,给实施课堂教学的主讲老师以更多的灵活性,不讲授部分可以指定学生自学或供学生参考阅读。《建筑智能化系统及工程应用》第1~9章为基本内容,第10章是一个实际工程项目的设计范例,较完整地讨论了一个中央集成管理系统,有一定可操作性,可供学生参考。2100433B
管道是Linux/UNIX系统中比较原始的进程间通信形式,它实现数据以一种数据流的方式,在多进程间流动。在系统中其相当于文件系统上的一个文件,来缓存所要传输的数据。管道通信是最常见的通信方式之一,其是在两个进程之间实现一个数据流通的管道,该管道可以是双向或单向的。
我们将仅能在一个方向上传递信息的管道称为半双工管道,将可在两个方向上传递信息的管道称为全双工管道。管道是一种很经典的进程之间的通信方式,其优点在于简单易用,其缺点在于功能简单,有很多限制。