匿名管道

✍ dations ◷ 2025-08-26 10:10:23 #匿名管道

匿名管道是计算机进程间的一种单工先进先出通信机制。全双工通信通常需要两个匿名管道。

典型场景为父进程创建匿名管道,然后创建一批子进程继承了这个匿名管道。由于这是未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。匿名管道并不支持异步读、写操作。

管道 (Unix)是类Unix系统上使用极其广泛的进程间传统通信机制。使用pipe 系统调用创建新的管道并返回一对文件描述符指向管道的读终端与写终端。

使用CreatePipe创建匿名管道。使用ReadFileWriteFile函数来读写管道。读写操作总是阻塞式。新建进程可继承管道句柄。

读管道时收到一个end-of-file,意味着管道的写端句柄已经关闭。

//  父进程#include <windows.h>int main(){    STARTUPINFO si;    PROCESS_INFORMATION pi;    char ReadBuf;    DWORD ReadNum;    HANDLE hRead; // 管道读句柄    HANDLE hWrite; // 管道写句柄    BOOL bRet = CreatePipe(&hRead, &hWrite, NULL, 0); // 创建匿名管道    if (bRet == TRUE)        printf("成功创建匿名管道!n");    else        printf("创建匿名管道失败,错误代码:%dn", GetLastError());    HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);// 得到本进程的当前标准输出    SetStdHandle(STD_OUTPUT_HANDLE, hWrite);// 设置标准输出到匿名管道    GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息    bRet = CreateProcess( // 创建子进程                NULL,   // No module name (use command line)		(LPSTR)(LPCSTR)"Client.exe",        // Command line					NULL,           // Process handle not inheritable		NULL,           // Thread handle not inheritable		FALSE,          // Set handle inheritance to FALSE		0,              // No creation flags		NULL,           // Use parent's environment block		NULL,           // Use parent's starting directory 		&si,            // Pointer to STARTUPINFO structure		&pi )           // Pointer to PROCESS_INFORMATION structure     if (bRet == TRUE)          printf("成功创建子进程!n");    else        printf("创建子进程失败,错误代码:%dn", GetLastError());    SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出    CloseHandle(hWrite); // 关闭写句柄    while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL))// 读管道直至管道关闭    {        ReadBuf = '';        printf("从管道读取%d字节数据n", ReadBuf, ReadNum);    }    if (GetLastError() == ERROR_BROKEN_PIPE) // 输出信息        printf("管道被子进程关闭n");    else        printf("读数据错误,错误代码:%dn", GetLastError());    return 0;}
//子进程的标准输出实际上已经重定向到匿名管道写端#include <stdio.h>int main(int argc, char* argv){    for (int i = 0; i < 100; i++) // 发送一些数据到标准输出和标准错误    {        printf("i = %dn", i); // 打印提示        cout << "标准输出:" << i << endl; // 打印到标准输出        cerr << "标准错误:" << i << endl; // 打印到标准错误    }    return 0;}

参见

  • 命名管道
  • 匿名命名管道
  • 管道 (Unix)

参考文献

  1. ^ Anonymous Pipe Operations. MSDN. . (原始内容存档于2011-06-05). Asynchronous (overlapped) read and write operations are not supported by anonymous pipes. 
  • Hart, Johnson M. Addison-Wesley, 2005. ISBN 0-321-25619-0
  • pipe(7) - Linux man page. . (原始内容存档于2010-03-23). 


相关

  • 夸拉伊夸拉伊(葡萄牙语:Quaraí)是巴西南大河州的一个市镇。总面积3147.637平方公里,总人口22552人,人口密度7.2人/平方公里。
  • 威廉·惠勒威廉·惠勒(英语:William Wyler,1902年7月1日-1981年7月27日),美国电影导演,奥斯卡最佳导演奖获得者。在西方,他常与另一位奥斯卡奖得主的导演比利·怀德被混淆,甚至误为同一人。因
  • 三人性行为三人性行为(英语:threesome)是群交的一种,俚语又称“3P/三劈”、“一王二后”、“起双飞”(MFF、两女一男)、“两王一后”(MMF、两男一女),有时另包括男男性行为或女女性行为。在多配
  • 督战队督战队为军队中的监督单位,在战场上监督军官和新兵,以防止消极避战和逃逸。与宪兵均最早出现于王朝时代的法国。若出现逃兵现象,历史上督战队有对逃亡的军官、士兵,不经军事法
  • 罗伯·萧恩·莱纳德罗伯·萧恩·莱纳德(英语:Robert Sean Leonard,1969年2月28日-)是一名美国电影、电视剧及舞台演员。他最为人所知的作品有《死亡诗社》及《豪斯医生》,但却是凭舞台上的演出屡获东
  • 京温事件京温事件,或称袁利亚事件,是安徽省庐江县同大镇永安村女子袁利亚坠楼身亡以及引发民众抗议等相关事件。2013年5月3日凌晨,袁利亚被发现在北京市京温服装批发市场坠楼身亡。北京
  • 北京2008武术比赛北京2008武术比赛(Wushu Tournament Beijing 2008)是经国际奥委会特批的于北京奥运会期间在北京举办的一项国际性武术赛事。比赛于8月21日至24日在北京奥林匹克体育中心体育馆
  • 都姓都姓是中文姓氏之一,在《百家姓》中排第349位。都姓有三个来源:
  • 华东电脑上海华东电脑股份有限公司(英语:SHANGHAI EAST-CHINA COMPUTER CO., LTD.),简称上海华东电脑股份、华东电脑股份和华东电脑,1993年由当时中华人民共和国电子工业部辖下第32研究所
  • 美国优先权顺序 阿根廷(英语:Argentine order of precedence) 澳大利亚(英语:Table of precedence for the Commonwealth of Australia) 孟加拉(英语:Bangladesh order of precedence) 巴巴多斯(英语:Table of precedence for Barbados) 比利时(英语:Belgian order of precedence) 巴西 加拿大 中华人民共和国 丹麦 芬兰 法国 德国 希腊 危地马拉