分享

《进程间通信之管道(一)——匿名管道》 - Perfecter

 ShaneWu 2009-11-13
管道
    管道,是用来进行进程间通信的一块共享内存。创建管道的进程是管道服务端,连接管道的进程是管道客户端。一个进程往管道里写入信息,然后另一个进程从管道里读出信息。本文介绍怎样创建、管理、使用管道。
1.关于管道
    管道有两种:匿名管道和命名管道。匿名管道比命名管道占用更少的资源,但是功能不如命名管道强大。
    这里说的管道,意思是用来交换信息的通道。从概念上讲,管道有两端。单向管道允许进程从一端向管道写入数据,再从管道另一端读出数据。双向管道允许进程在管道的一端读写。
1.1匿名管道
    匿名管道是一种未命名的、单向管道。通常用来在父进程和子进程之间传输数据。匿名管道总是本地的,不能在网络之间传递数据。
1.1.1匿名管道操作
    CreatePipe函数创建一个匿名管道,并且返回两个句柄:一个读管道的句柄和一个写管道的句柄。读句柄具有管道的只读权限,写句柄具有管道的只写权 限。为了利用管道交换数据,管道服务端必须把管道句柄传给另一个进程。通常情况下,这是通过继承实现的(参见1.1.2);就是说,父进程允许子进程继承 这个句柄。进程也可以使用DuplicateHandle函数复制一个管道句柄,再通过一些进程间通信机制,比如DDE或者共享内存,把它发送给另一个不 相关的进程。
    管道服务端可以给管道服务端发送读句柄或者写句柄,这取决于客户端要用这个管道发送数据还是获取数据。要从管道读取数据,以管道的读句柄为参数调用 ReadFile函数。当另一个进程向管道写入数据是,ReadFile函数返回。如果管道的所有写句柄被关闭,或者读取数据时有错误发 生,ReadFile函数也会返回。
    要向管道写入数据,以管道的写句柄问参数,调用WriteFile函数。数据被完全写入管道,或者出错,WriteFile将会返回。如果管道的缓存已 满,且还有尚未写完的数据,直到另一个进程从管道读取数据前,WriteFile函数都不会返回。缓存的大小是在管道服务端调用CreatePipe函数 时指定的。
    匿名管道不支持异步读写。这意味着不能使用ReadFileEx和WriteFileEx函数读写匿名管道。另外,使用匿名管道时,ReadFile和WriteFile函数的lpOverlapped参数也会被忽略。
    匿名管道会一直存在,直到所有的读写句柄全部被关闭。进程可以调用CloseHandle函数关闭管道句柄。进程终止时,所有的管道句柄也会被自动关闭。
1.1.2管道句柄的继承
    通过一下几个方法,管道服务端控制管道句柄是否可以被继承:
    一、调用CreatePipe时,将SECURITY_ATTRIBUTES参数的成员bInheritHandle设为TRUE,那么这个CreatePipe创建的管道就可以被继承。
    二、管道服务端可以利用DuplicateHandle函数改变管道句柄的继承特性。管道服务到可以从可继承的管道句柄复制出不可继承的句柄,也可以从不可继承的管道句柄复制出可继承的句柄。
    三、CreateProcess函数使得管道服务端可以决定子进程是否继承自己的所有句柄。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多