匿名管道

网球作者 / 世界之声 / 2025-07-01 11:47
"
  匿名管道是计算机进程间的一种单工先进先出通信机制。全双工通信通常需要两个匿名管道。  典型场景为父进程创建匿名管道,

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

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

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

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

  读管道时收到一个end-of-file,意味着管道的写端句柄已经关闭。

  // 父进程

  #include

  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, // 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("成功创建子进程!

  ");

  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

  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)

分享到
声明:本文为用户投稿或编译自英文资料,不代表本站观点和立场,转载时请务必注明文章作者和来源,不尊重原创的行为将受到本站的追责;转载稿件或作者投稿可能会经编辑修改或者补充,有异议可投诉至本站。

热文导读