`
ajuanlong
  • 浏览: 108943 次
社区版块
存档分类
最新评论

进程通信之二 管道技术第二篇 匿名管道

 
阅读更多

上一篇《进程通信之二 管道技术第一篇 输入输出的重定向》示范了增加若干程序代码来完成程序输入输出的重定向,并提出了如果没有程序源代码,只有程序文件如何来完成重定向。本篇就介绍如何使用匿名管道来完成这一任务。

计算机中管道pipe类似于现实世界中的水管道,在一端放入水流,另一端就会流出来。在计算机机中水流自然被数据流所代替了。计算机中管道分为匿名管道和命名管道,本篇将主要介绍用匿名管道来完成这一重定向输出任务,命名管道就留给下一篇来介绍了。

先来看看如何创建和使用匿名管道。

第一个 CreatePipe

函数功能:创建管道

函数原型:

BOOLWINAPICreatePipe(

PHANDLEhReadPipe,

PHANDLEhWritePipe,

LPSECURITY_ATTRIBUTESlpPipeAttributes,

DWORDnSize

);

函数说明:

第一个参数返回新创建的管道的读取端句柄。

第二个参数返回新创建的管道的写入端句柄。

注意不能在管道的读取端写入数据也不能在写入端读取数据。

第三个参数表示管道的安全属性,通常可以作如下设置:

SECURITY_ATTRIBUTES sa;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);

sa.lpSecurityDescriptor = NULL;

sa.bInheritHandle = TRUE;

第四个参数表示管道的缓冲区容量,为0表示使用默认大小。

函数执行成功返回TRUE,否则返回FALSE

第二个 ReadFile

函数功能:从管道中读取数据

函数原型:

BOOLReadFile(

HANDLEhFile,

LPVOIDlpBuffer,

DWORDnNumberOfBytesToRead,

LPDWORDlpNumberOfBytesRead,

LPOVERLAPPEDlpOverlapped

);

函数说明:

第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。

第二个参数是一个指向缓冲区的指针,函数将读取的数据写入该缓冲区。

第三个参数的表达非常好,光从名字上就可以知道这是用来指定读取的字节数。

第四个参数将返回实际读取到的字节数。

第五个参数是用于异步操作方面,一般传入NULL即可。

第三个 WriteFile

函数功能:向管道写入数据

函数原型:

BOOLWriteFile(

HANDLEhFile,

LPCVOIDlpBuffer,

DWORDnNumberOfBytesToWrite,

LPDWORDlpNumberOfBytesWritten,

LPOVERLAPPEDlpOverlapped

);

函数说明:

第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。

第二个参数是一个指针,该指针指向待写入管道的数据。

第三个参数表示要写入的字节数。

第四个参数将返回实际写入管道的字节数。

第五个参数是用于异步操作方面,一般传入NULL即可。

第四个CloseHandle

函数功能:关闭管道的一端

函数原型:BOOLCloseHandle(HANDLEhObject);

函数说明:当读取和写入端都关闭后,系统会关闭管道并回收资源。

从后面三个函数可以看出,向管道中读取和写入数据就和向文件中读取和写入数据是一样的(事实上管道也是一种特殊的文件——内存映射文件)。

使用管道要注意的一个地方是:读取和写入数据时,一定要注意顺序,MSDN上说,如果管道中没有数据,调用ReadFile()会造成阻塞,直到有其它线程将数据写入管道。同样,当有线程正在管道中读取数据时,其它试图将数据写入管道的的线程也会被阻塞。

因此对上一篇的示例程序进行重定向时,可以先创建二个管道,一个用来存放输入数据,称为数据输入管道,另一个用来存放输出数据,称为数据输出管道。然后从输入文件中读取数据并写入数据输入管道。再启动示例程序作为子进程,子进程的输入输出已经改成从数据输入管道中读取和输出到数据输出管道。子进程运行结束后,从数据输出管道中将数据写入到输出文件即可。整个流程图如下所示:

下面给出使用管道的示例代码:

运行结果如下图:

结果完全正确,说明我们的程序已经完成了启动其它程序并对它进行重定向这一功能。

对匿名管道总结一下:匿名管道有读取端和写入端。匿名管道创建(CreatePipe)后就可以像读写文件一样的对管道中的数据读写(ReadFileWriteFile),但要注意读写顺序。匿名管道在关闭两端后会由系统销毁并回收资源。

匿名管道的使用比较常见,下面是二个安装程序的截图。

QQ游戏的安装过程截图:

五笔编码及时查的安装过程截图:

对比下这二个截图,显示的内容都差不多,都是解压缩文件并移动到指定地方。唯一不同的是一个是控制台界面,另一个是图形界面。联想上面的程序,不难得知QQ游戏的安装实际也是使用管道将一个控制台程序的输出内容显示到图形界面,这样既美观又便于维护。

下一篇《进程通信之二 管道技术第三篇 命名管道》将介绍命名管道的使用,欢迎参阅。

注:不知道程序代码的情况下还可以使用批处理来完成。批处理使用><来重定向,>为输出到文件,如果文件不存在就创建,已存在就清空原文件后再写入,<为从文件读取。批处理文件的内容可以这样写:

@echo off

<infile.txt 标准程序.exe >outfile.txt

也可以这样写:

@echo off

标准程序.exe <infile.txt >outfile.txt

批处理重定向的内部实现原理当然也是使用匿名管道。

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7390441

如果觉得本文对您有帮助,请点击支持一下,您的支持是我写作最大的动力,谢谢。

分享到:
评论

相关推荐

    linux进程间的通信:匿名管道

    然而,对于更复杂的多进程通信,可能需要考虑使用其他IPC机制,如命名管道(有名管道)、消息队列、共享内存或套接字等。 总的来说,Linux中的匿名管道是进程间通信的一个基础工具,虽然功能相对有限,但在特定场景...

    Linux进程间通信之管道

    标签"LINUX IPC PIPE"表明这是一个关于Linux进程间通信管道的知识点。文件"pipe"可能包含了示例代码或实验数据,用于演示如何在C语言或其他支持系统调用的编程语言中实现父子进程间的管道通信。 总之,Linux进程间...

    各种多进程之间的通信实例

    在计算机编程领域,多进程通信(IPC,Inter-Process Communication)是实现不同进程间数据交换和协调工作的重要技术。在给定的标题“各种多进程之间的通信实例”中,我们可以推测这是一个展示了多种IPC方法的实际...

    UNIX网络编程_卷2_进程间通信

    卷2:进程间通信(第2版)》这本书是W.Richard Stevens所著的网络编程领域的权威之作。本书详细介绍了UNIX系统中进程间通信(IPC)的各种形式,这些通信机制对于提高UNIX程序性能至关重要,同时是开发不同主机间网络...

    简易进程管道通信,新程序与已开程序的沟通

    在Unix/Linux系统中,管道由匿名管道(anonymous pipe)实现,它创建一个临时的、无名的文件描述符,供父进程和子进程共享。当一个进程向管道写入数据时,另一个进程可以读取这些数据。管道的容量有限,所以如果写入...

    UNIX进程间通信(第二版)

    本书的第二版可能对原有的内容进行了更新和扩展,以适应不断发展的技术环境。 UNIX进程间通信主要包括以下几种方式: 1. **管道(Pipe)**:这是最早的IPC形式之一,允许单向数据流。一个进程可以将数据写入管道,...

    C#管道通信

    本篇文章将深入探讨C#中的管道通信,主要包括匿名管道、命名管道、命名管道Message模式以及半双工管道的使用。 1. **匿名管道**:匿名管道是临时的,只能在具有继承关系的进程之间使用。在C#中,我们可以使用`...

    操作系统进程通信Java源码

    2. **匿名管道(Anonymous Pipes)**:匿名管道与管道类似,但在Java中不常用,因为它们不支持跨线程或跨进程通信。 3. **命名管道(Named Pipes)**:在Java中,通常使用`java.nio.channels.Pipe`类来创建命名管道...

    Windows命名管道技术的分析与实现.pdf

    匿名管道存在于内存中,当创建它的进程结束时,管道也随之消失。这种管道无法在网络环境中使用,且仅限于同一台计算机上的进程通信。 2. **命名管道**:相较于匿名管道,命名管道更为高级和通用。它不仅可以在同一...

    实验四-进程间管道通信.doc

    第二个示例(`s4-3-2.c`)展示了更复杂的场景,即父进程创建多个子进程,并通过管道接收来自不同子进程的数据。 ```c #include int main() { int r, p1, p2, fd[2]; char buf[50], s[50]; if (pipe(fd) == -1...

    Unix网络编程 第二卷 进程间通信 Steve

    《Unix网络编程》第二卷,由Steve撰写,是关于进程间通信(IPC)的经典之作,深受广大系统程序员和网络开发者推崇。这本书深入探讨了在Unix操作系统环境下,如何实现不同进程之间的有效通信,这对于构建分布式系统、...

    《VC++深入详解》第17章 进程间通信

    匿名管道简单且效率高,但仅限于同一台计算机上的进程通信,不支持网络通信。 3. **命名管道**:相比于匿名管道,命名管道提供了更强大的功能,支持双向通信,且可以通过网络进行进程间通信。创建命名管道需通过...

    Unix网络编程第二卷 - 进程间通信.rar

    《Unix网络编程第二卷 - 进程间通信》是一本深入探讨Unix系统中进程间通信(Inter-Process Communication, IPC)的经典著作。该书详细阐述了在Unix环境中,不同进程如何有效地交换数据和协调工作,涵盖了多种IPC机制...

    VC学习笔记之二:进程通信.doc

    #### 一、进程通信概念及技术分类 进程通信是指不同进程之间进行数据交换和同步的技术。在Windows平台下,进程通信主要包括以下几种方式: 1. **消息(Message)** - 消息机制是基于Windows消息循环的基础之上,通过...

    UNIX网络编程 第2版 第2卷 进程间通信

    《UNIX网络编程 第2版 第2卷 进程间通信》是UNIX系统中关于进程间通信(IPC,Inter-Process Communication)的经典著作。这本书深入探讨了在UNIX环境下,不同进程如何有效地交换数据和协调工作,是理解操作系统核心...

    实验七-进程通信.doc

    2. **实践技能**:掌握利用无名管道(匿名管道)进行进程间通信的编程技巧,并能够独立完成相关的调试任务。 #### 二、实验说明 管道(Pipe)作为进程间通信(IPC)的一种基本机制,允许两个进程之间进行简单有效...

    Linux下的管道编程技术

    所有的管道技术,无论是半双工的匿名管道还是命名管道,都采用FIFO(先进先出)排队模型来管理进程间的通信。 - **匿名管道**:这种管道只能用于连接具有共同祖先的进程,例如父子进程间的通信。它们是临时的,当...

    UNIX网络编程 第2卷 进程间通信

    《UNIX网络编程 第2卷 进程间通信》是一本深入探讨UNIX系统中进程间通信(Inter-Process Communication, IPC)的经典著作。该书详细阐述了如何在多进程环境中实现高效、安全的数据交换,是软件开发者尤其是系统...

    UNIX网络编程+第2卷+进程间通信

    《UNIX网络编程 第2卷:进程间通信》是网络编程领域的一部经典之作,由W. Richard Stevens和Stephen A. Rago共同撰写。这本书深入探讨了在UNIX操作系统环境下,不同进程如何有效地进行通信,这对于理解和实现多进程...

Global site tag (gtag.js) - Google Analytics