匿名管道是计算机进程间的一种单工先进先出通信机制。全双工通信通常需要两个匿名管道。
典型场景为父进程创建匿名管道,然后创建一批子进程继承了这个匿名管道。由于这是未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。匿名管道并不支持异步读、写操作。
管道 (Unix)是类Unix系统上使用极其广泛的进程间传统通信机制。使用pipe
系统调用创建新的管道并返回一对文件描述符指向管道的读终端与写终端。
使用CreatePipe
创建匿名管道。使用ReadFile
与WriteFile
函数来读写管道。读写操作总是阻塞式。新建进程可继承管道句柄。
读管道时收到一个end-of-file,意味着管道的写端句柄已经关闭。
// 父进程#include windows.hint main(){ STARTUPINFO si; PROCESS_INFORMATION pi; char ReadBuf; DWORD ReadNum; HANDLE hRead; // 管道读句柄 HANDLE hWrite; // 管道写句柄 BOOL bRet = CreatePipe( // 创建匿名管道 if (bRet == TRUE) printf("成功创建匿名管道!n"); else printf("创建匿名管道失败,错误代码:%dn", GetLastError()); HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);// 得到本进程的当前标准输出 SetStdHandle(STD_OUTPUT_HANDLE, hWrite);// 设置标准输出到匿名管道 GetStartupInfo( // 获取本进程的STARTUPINFO结构信息 bRet = CreateProcess( // 创建子进程 NULL, // No module name (use command line)(LPSTR)(LPCSTR)"Client.exe", // Command lineNULL, // Process handle not inheritableNULL, // Thread handle not inheritableFALSE, // Set handle inheritance to FALSE0, // No creation flagsNULL, // Use parent's environment blockNULL, // Use parent's starting directory else printf("创建子进程失败,错误代码:%dn", GetLastError()); SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出 CloseHandle(hWrite); // 关闭写句柄 while (ReadFile(hRead, ReadBuf, 100, printf("从管道读取%d字节数据n", ReadBuf, ReadNum); } if (GetLastError() == ERROR_BROKEN_PIPE) // 输出信息 printf("管道被子进程关闭n"); else printf("读数据错误,错误代码:%dn", GetLastError()); return 0;}
热门信息
阅读 (128)
1 童子命的口诀对照表,是不是童子命一查就知道阅读 (88)
2 让男人爱你的咒语——和合术咒语阅读 (71)
3 自己怎么简单的做和合术?找道长做快速挽回阅读 (70)
4 和合术真都有用吗?效果好吗?阅读 (68)
5 阳宅风水学入门图解大全100例,让你马上成为风水专家