
_START_ARTICLE_
匿名管道
_START_PARAGRAPH_
匿名管道是计算机进程间的一种单工先进先出通信机制。全双工通信通常需要两个匿名管道。_NEWLINE_典型场景为父进程创建匿名管道，然后创建一批子进程继承了这个匿名管道。由于这是未命名的管道，只能在本地计算机中使用，而不可用于网络间的通信。匿名管道并不支持异步读、写操作。
_START_SECTION_
Unix
_START_PARAGRAPH_
管道 (Unix)是类Unix系统上使用极其广泛的进程间传统通信机制。使用pipe 系统调用创建新的管道并返回一对文件描述符指向管道的读终端与写终端。
_START_SECTION_
Windows操作系统
_START_PARAGRAPH_
使用CreatePipe创建匿名管道。使用ReadFile与WriteFile函数来读写管道。读写操作总是阻塞式。新建进程可继承管道句柄。 _NEWLINE_读管道时收到一个end-of-file，意味着管道的写端句柄已经关闭。
_START_SECTION_
例子
_START_PARAGRAPH_
//  父进程#include <windows.h>int main(){_NEWLINE_    STARTUPINFO si;_NEWLINE_    PROCESS_INFORMATION pi;_NEWLINE_    char ReadBuf[100];_NEWLINE_    DWORD ReadNum;_NEWLINE_    HANDLE hRead; // 管道读句柄_NEWLINE_    HANDLE hWrite; // 管道写句柄_NEWLINE_    BOOL bRet = CreatePipe(&hRead, &hWrite, NULL, 0); // 创建匿名管道_NEWLINE_    if (bRet == TRUE)_NEWLINE_        printf("成功创建匿名管道!\n");_NEWLINE_    else_NEWLINE_        printf("创建匿名管道失败,错误代码:%d\n", GetLastError());_NEWLINE_    HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);// 得到本进程的当前标准输出_NEWLINE_    SetStdHandle(STD_OUTPUT_HANDLE, hWrite);// 设置标准输出到匿名管道_NEWLINE_    GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息_NEWLINE_    bRet = CreateProcess( // 创建子进程_NEWLINE_                NULL,   // No module name (use command line)_NEWLINE_(LPSTR)(LPCSTR)"Client.exe",        // Command line_NEWLINE_NULL,           // Process handle not inheritable_NEWLINE_NULL,           // Thread handle not inheritable_NEWLINE_FALSE,          // Set handle inheritance to FALSE_NEWLINE_0,              // No creation flags_NEWLINE_NULL,           // Use parent's environment block_NEWLINE_NULL,           // Use parent's starting directory _NEWLINE_&si,            // Pointer to STARTUPINFO structure_NEWLINE_&pi )           // Pointer to PROCESS_INFORMATION structure _NEWLINE_    if (bRet == TRUE)  _NEWLINE_        printf("成功创建子进程!\n");_NEWLINE_    else_NEWLINE_        printf("创建子进程失败,错误代码:%d\n", GetLastError());_NEWLINE_    SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出_NEWLINE_    CloseHandle(hWrite); // 关闭写句柄_NEWLINE_    while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL))// 读管道直至管道关闭_NEWLINE_    {_NEWLINE_        ReadBuf[ReadNum] = '\0';_NEWLINE_        printf("从管道[%s]读取%d字节数据\n", ReadBuf, ReadNum);_NEWLINE_    }_NEWLINE_    if (GetLastError() == ERROR_BROKEN_PIPE) // 输出信息_NEWLINE_        printf("管道被子进程关闭\n");_NEWLINE_    else_NEWLINE_        printf("读数据错误,错误代码:%d\n", GetLastError());_NEWLINE_    return 0;}_NEWLINE_//子进程的标准输出实际上已经重定向到匿名管道写端#include <stdio.h>_NEWLINE_int main(int argc, char* argv[])_NEWLINE_{_NEWLINE_    for (int i = 0; i < 100; i++) // 发送一些数据到标准输出和标准错误{_NEWLINE_        printf("i = %d\n", i); // 打印提示cout << "标准输出:" << i << endl; // 打印到标准输出cerr << "标准错误:" << i << endl; // 打印到标准错误}_NEWLINE_    return 0;_NEWLINE_}