匿名管道

✍ dations ◷ 2025-11-06 04:51:19 #匿名管道

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

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

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


相关

  • 厄尔布尔士山脉厄尔布尔士山脉,里海南岸的山脉,大体上位于伊朗北部,环绕里海南部。最高峰是德马峰,高5604米。厄尔布尔士山脉(Alborz)( listen 帮助·信息,波斯语: البرز‎),也被拼写为 Alburz
  • 女真人女真(女真文:,转写:.mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode","Code2000","Gentium","Gentium Alte
  • 来宾市来宾市(壮文:Laizbinh)是中华人民共和国广西壮族自治区下辖的地级市,位于广西中部。市境西南接南宁市,西北邻河池市,北界柳州市,东北连桂林市、梧州市,东南毗贵港市。地处桂中盆地低
  • 后施韦采山坐标:46°46′24″N 10°54′53″E / 46.77333°N 10.91472°E / 46.77333; 10.91472后施韦采山(德语:Hintere Schwärze),是中欧的山峰,位于奥地利和意大利接壤的边境,属于奥特勒
  • 中国人民解放军东部战区海军训练基地中国人民解放军军徽中国人民解放军东部战区海军训练基地,位于浙江省江山市,是中国人民解放军东部战区海军的训练基地。1983年7月,中国人民解放军海军东海舰队训练基地成立。该
  • 安蒂萨纳火山安蒂萨纳火山(Antisana)是厄瓜多尔安第斯山脉北部的层状火山,位于首都基多东南50公里,高度5,752米(18,871英尺),是厄瓜多尔第四高的火山,属于厄瓜多尔境内其中一个攀爬最困难的安第
  • 两西西里的路易吉 (1824-1897)两西西里的路易吉(意大利语:,1824年7月19日—1897年3月5日),阿奎拉伯爵,两西西里国王法兰西斯科一世的第五子。1844年,路易吉与巴西皇帝佩德罗二世的姐姐雅努阿丽亚结婚,两人共有2子
  • 罗尔夫·布雷姆罗尔夫·布雷姆(德语:Rolf Brem,1926年2月12日-2014年4月11日),是一名瑞士艺术家,他以绘图、雕刻和插画为著名。他的作品在瑞士各地都有,并在很多艺术展览会上展示。2014年4月11日,他因病去世,享年88岁。
  • 曹玮曹玮(973年-1030年),字宝臣,北宋名将,曹彬次子。生于太祖开宝六年,卒于仁宗天圣八年,年五十八,谥武穆。沉勇有谋,好读书,通《春秋》,尤善《左氏传》。为将四十年,战未尝败。初为天平武宁两军牙内都虞候,至道初为西头供奉官(阶官,三班使臣,从八品)、阁门祗候(职,从八品)。时李继迁据河西为乱,太宗问大臣“谁可挡继迁者”。曹彬以玮应诏,时曹玮为东头供奉官,以本官知渭州事。真宗即位,改内殿崇班(阶官,三班使臣,正八品)。驭军严明有部分,赏罚立决,犯令者无所贷。善用间,周知虏动静,举措如老将。宋真宗曾在曹彬
  • 伯虔伯虔(前501年-?),字子析、表字又作子皙、楷、揩、哲,《孔子家语·弟子解》作伯处。春秋时期鲁国人。孔子弟子。伯虔事迹不详。一说是斗伯比的后裔,小孔子五十岁。