fbpx
维基百科

匿名管道

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

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

Unix 编辑

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

Windows操作系统 编辑

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

读管道时收到一个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("成功创建匿名管道!\n");  else  printf("创建匿名管道失败,错误代码:%d\n", 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("创建子进程失败,错误代码:%d\n", GetLastError());  SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出  CloseHandle(hWrite); // 关闭写句柄  while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL))// 读管道直至管道关闭  {  ReadBuf[ReadNum] = '\0';  printf("从管道[%s]读取%d字节数据\n", ReadBuf, ReadNum);  }  if (GetLastError() == ERROR_BROKEN_PIPE) // 输出信息  printf("管道被子进程关闭\n");  else  printf("读数据错误,错误代码:%d\n", GetLastError());  return 0; } 
//子进程的标准输出实际上已经重定向到匿名管道写端 #include <stdio.h> int main(int argc, char* argv[]) { for (int i = 0; i < 100; i++) // 发送一些数据到标准输出和标准错误 { printf("i = %d\n", i); // 打印提示 cout << "标准输出:" << i << endl; // 打印到标准输出 cerr << "标准错误:" << i << endl; // 打印到标准错误 } return 0; }

参见 编辑

参考文献 编辑

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


匿名管道, 是计算机进程间的一种单工先进先出通信机制, 全双工通信通常需要两个, 典型场景为父进程创建, 然后创建一批子进程继承了这个, 由于这是未命名的管道, 只能在本地计算机中使用, 而不可用于网络间的通信, 并不支持异步读, 写操作, 目录, unix, windows操作系统, 例子, 参见, 参考文献unix, 编辑管道, unix, 是类unix系统上使用极其广泛的进程间传统通信机制, 使用pipe, 系统调用创建新的管道并返回一对文件描述符指向管道的读终端与写终端, windows操作系统, 编辑使用. 匿名管道是计算机进程间的一种单工先进先出通信机制 全双工通信通常需要两个匿名管道 典型场景为父进程创建匿名管道 然后创建一批子进程继承了这个匿名管道 由于这是未命名的管道 只能在本地计算机中使用 而不可用于网络间的通信 匿名管道并不支持异步读 写操作 目录 1 Unix 2 Windows操作系统 2 1 例子 3 参见 4 参考文献Unix 编辑管道 Unix 是类Unix系统上使用极其广泛的进程间传统通信机制 使用pipe 系统调用创建新的管道并返回一对文件描述符指向管道的读终端与写终端 Windows操作系统 编辑使用CreatePipe创建匿名管道 使用ReadFile与WriteFile函数来读写管道 读写操作总是阻塞式 1 新建进程可继承管道句柄 读管道时收到一个end of file 意味着管道的写端句柄已经关闭 例子 编辑 父进程 include lt windows h gt int main STARTUPINFO si PROCESS INFORMATION pi char ReadBuf 100 DWORD ReadNum HANDLE hRead 管道读句柄 HANDLE hWrite 管道写句柄 BOOL bRet CreatePipe amp hRead amp hWrite NULL 0 创建匿名管道 if bRet TRUE printf 成功创建匿名管道 n else printf 创建匿名管道失败 错误代码 d n GetLastError HANDLE hTemp GetStdHandle STD OUTPUT HANDLE 得到本进程的当前标准输出 SetStdHandle STD OUTPUT HANDLE hWrite 设置标准输出到匿名管道 GetStartupInfo amp 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 amp si Pointer to STARTUPINFO structure amp pi Pointer to PROCESS INFORMATION structure if bRet TRUE printf 成功创建子进程 n else printf 创建子进程失败 错误代码 d n GetLastError SetStdHandle STD OUTPUT HANDLE hTemp 恢复本进程的标准输出 CloseHandle hWrite 关闭写句柄 while ReadFile hRead ReadBuf 100 amp ReadNum NULL 读管道直至管道关闭 ReadBuf ReadNum 0 printf 从管道 s 读取 d字节数据 n ReadBuf ReadNum if GetLastError ERROR BROKEN PIPE 输出信息 printf 管道被子进程关闭 n else printf 读数据错误 错误代码 d n GetLastError return 0 子进程的标准输出实际上已经重定向到匿名管道写端 include lt stdio h gt int main int argc char argv for int i 0 i lt 100 i 发送一些数据到标准输出和标准错误 printf i d n i 打印提示 cout lt lt 标准输出 lt lt i lt lt endl 打印到标准输出 cerr lt lt 标准错误 lt lt i lt lt endl 打印到标准错误 return 0 参见 编辑命名管道 匿名命名管道 管道 Unix 参考文献 编辑 Anonymous Pipe Operations MSDN 2010 02 27 原始内容存档于2011 06 05 Asynchronous overlapped read and write operations are not supported by anonymous pipes Hart Johnson M Windows System Programming Third Edition Addison Wesley 2005 ISBN 0 321 25619 0 pipe 7 Linux man page 2010 02 27 原始内容存档于2010 03 23 取自 https zh wikipedia org w index php title 匿名管道 amp oldid 63394938, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。