匿名管道

✍ dations ◷ 2025-06-18 16:49:36 #匿名管道

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

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

管道 (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). 


相关

  • 长颈鹿长颈鹿属(学名:Giraffe)是一属生长在非洲的反刍偶蹄动物,共有四个物种,是现存世界上最高的陆生动物。一般雄性个体高达4.8到5.5米高,重达900千克。雌性个体一般要小一些。长颈鹿是
  • 凹脸蝠凹脸蝠(学名:Craseonycteris thonglongyai),哺乳纲、翼手目的一种。它是凹脸蝠科凹脸蝠属下的单科种。分布于泰国西部及缅甸东南部,在沿河附近的石灰岩洞中生活。凹脸蝠是蝙蝠中
  • 牵引机拖拉机(英语:Tractor,又称为牵引机、曳引机)是一种用来拖拉、牵引其他不能自行移动设备的装备。一般来说,它是一种用来拖拽其他车辆或设备的车辆。这词源自拉丁语trahere、traho
  • 锰酸钠锰酸钠,化学式为Na2MnO4,是一种深绿色固体,是K2MnO4罕见的类似物。其之所以罕见是因为它不能轻易地由MnO2与氢氧化钠的氧化反应制得。相反,这个氧化反应止步于生成Na3MnO4,且这种
  • 莉莉·科尔莉莉·科尔(Lily Cole,1987年12月27日-),英国超级名模、演员。莉莉在英格兰德文郡的托基出生,与姐姐Elvie于伦敦长大。莉莉在14岁时于伦敦苏豪区街头被星探发掘,但她转身离去。她其
  • 阿拉德 (伊朗)阿拉德(波斯语:ارد‎,转写:Arad)是伊朗的城市,位于该国南部札格罗斯山脉东南部,由法尔斯省负责管辖,距离首府设拉子230公里,海拔高度587米,2006年人口5,264。
  • 盘果木科参见正文。盘果木科又名圆唇花科,共有2属5种,全部生长在非洲东部索马里沿海的狭小地带,是当地的特有种。1981年的克朗奎斯特分类法将其列在马鞭草科中,属于蔷薇目,1998年根据基因
  • 埃尔斯沃思·多尔蒂埃尔斯沃思·C·多尔蒂(英语:Ellsworth C. Dougherty,1921年-1965年)是一位线虫动物学家,与维克多·尼贡在1940年代首个将秀丽隐杆线虫(学名:)引入实验室研究。为纪念埃尔斯沃思·多
  • 伊日娜·切尔马科娃伊日娜·切尔马科娃(捷克语:Jiřina Čermáková,1944年11月17日-2019年11月17日),捷克女子曲棍球运动员。她曾代表捷克斯洛伐克国家队参加1980年夏季奥林匹克运动会曲棍球比赛,获得一枚银牌。
  • 切萨雷·巴尔博切萨雷·巴尔博,维纳迪奥伯爵(意大利语:Cesare Balbo,Contare di Vinadio,1789年11月21日-1853年6月3日),意大利政治家、作家,是撒丁王国第一任首相。1789年,出生于都灵的贵族家庭。1816年,在西班牙马德里公使馆任秘书。1821年,被流放。1848年,任撒丁王国首相,7月辞职。1853年,去世。