匿名管道是一种在计算机进程之间进行单向通信的先进先出机制。实现全双工通信通常需要两个匿名管道。
常见的应用场景是父进程创建一个匿名管道,然后一系列子进程继承这个管道。由于匿名管道没有名称,因此只能在本地计算机上使用,无法用于网络通信。此外,匿名管道不支持异步的读写操作。
Unix
在类Unix系统中,管道 (Unix) 是一种被广泛使用的进程间通信机制。通过系统调用创建新的管道,并返回一对文件描述符,分别指向管道的读端和写端。
Windows操作系统
在Windows中,可以创建匿名管道,并使用相关函数进行读写操作。所有的读写操作都是阻塞式的。新创建的进程可以继承管道的句柄。
当读取管道时,如果接收到end-of-file,表示管道的写端句柄已经被关闭。
示例
// 父进程 #include <windows.h> int main() { STARTUPINFO si; PROCESS_INFORMATION pi; char ReadBuf[100]; DWORD ReadNum; HANDLE hRead; // 管道读句柄 HANDLE hWrite; // 管道写句柄 BOOL bRet = CreatePipe(&hRead, &hWrite, NULL, 0); // 创建匿名管道 if (bRet == TRUE) printf("成功创建匿名管道! "); else printf("创建匿名管道失败,错误代码:%d ", GetLastError()); HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);// 获取当前进程的标准输出 SetStdHandle(STD_OUTPUT_HANDLE, hWrite);// 将标准输出重定向到匿名管道 GetStartupInfo(&si); // 获取当前进程的STARTUPINFO结构 bRet = CreateProcess( // 创建子进程 NULL, // 无模块名(使用命令行) (LPSTR)(LPCSTR)"Client.exe", // 命令行 NULL, // 进程句柄不可继承 NULL, // 线程句柄不可继承 FALSE, // 设置句柄继承为FALSE 0, // 无创建标志 NULL, // 使用父进程的环境块 NULL, // 使用父进程的起始目录 &si, // 指向STARTUPINFO结构的指针 &pi ) // 指向PROCESS_INFORMATION结构的指针 if (bRet == TRUE) printf("成功创建子进程! "); else printf("创建子进程失败,错误代码:%d ", GetLastError()); SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复当前进程的标准输出 CloseHandle(hWrite); // 关闭写句柄 while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL))// 读取管道直到关闭 { ReadBuf[ReadNum] = '0'; printf("从管道[%s]读取%d字节数据 ", ReadBuf, ReadNum); } if (GetLastError() == ERROR_BROKEN_PIPE) // 输出信息 printf("管道被子进程关闭 "); else printf("读取数据错误,错误代码:%d ", GetLastError()); return 0; }
// 子进程的标准输出实际上已经重定向到匿名管道的写端 #include <stdio.h> int main(int argc, char* argv[]) { for (int i = 0; i < 100; i++) // 向标准输出和标准错误发送一些数据 { printf("i = %d ", i); // 打印提示 cout << "标准输出:" << i << endl; // 打印到标准输出 cerr << "标准错误:" << i << endl; // 打印到标准错误 } return 0; }
相关内容
- 命名管道
- 匿名命名管道
- 管道 (Unix)
本文来自作者[admin]投稿,不代表osvcn号立场,如若转载,请注明出处:https://osvcn.cn/cskp/202506-237.html
评论列表(4条)
我是osvcn号的签约作者“admin”!
希望本篇文章《隐秘通道》能对你有所帮助!
本站[osvcn号]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育
本文概览: 匿名管道是一种在计算机进程之间进行单向通信的先进先出机制。实现全双工通信通常需要两个匿名管道。 常见的应用场景是父进程创建一个匿名管道,然后一系列子进程继承这个管道。...