管道重定向符“|”

原文链接:http://blog.titilima.com/show-259-1.html

在 cmd.exe 的命令行模式下,管道重定向符“|”用于把一个命令的输出传递给另一个程序,比如,在查看一个比较长的文件时,需要把 type 命令的结果分页显示,这时候就需要把它重定向到 more 命令,如:

type somefile.txt | more

管道重定向符“|”的实质作用是把 type 的输出结果发送给 more 进程的标准输入句柄(STD_INPUT_HANDLE),more 进程则不断读取这个句柄的内容,并将读出的内容计算后分页输出。

下面的示例代码 DbgPrint 示范了如何使用 STD_INPUT_HANDLE。

  1. // DbgPrint.cpp
  2. #include <Windows.h>
  3. #include <tchar.h>
  4. int main(void)
  5. {
  6.     HANDLE hPipe = GetStdHandle(STD_INPUT_HANDLE);
  7.    
  8.     CHAR str[1024];
  9.     DWORD dwRead;
  10.     BOOL b;
  11.     do
  12.     {
  13.         ZeroMemory(str, sizeof(str));
  14.         b = ReadFile(hPipe, str, sizeof(str), &dwRead, NULL);
  15.         if (b && dwRead > 0)
  16.             OutputDebugStringA(str);
  17.     } while (b && dwRead > 0);
  18.     return 0;
  19. }

代码编译完成后,可以在命令行中输入:

dir | DbgPrint

这样将会使 dir 的结果重定向到 DbgPrint 的标准输入句柄中,也就是由 OutputDebugStringA 来输出。下图是由 DebugView 所捕获的调试信息,也就是dir的输出。

最后说一句,最初我尝试在 do-while 中使用 ReadConsoleA 来获取管道输出,但是什么也得不到,而 ReadFile 则工作正常。查了一下 MSDN ,其中对 GetStdHandle 的解释有这么一句:

These handles can be used by the ReadFile and WriteFile functions, or by any of the console functions that access the console input buffer or a screen buffer (for example, the ReadConsoleInput, WriteConsole, or GetConsoleScreenBufferInfo functions).

如此看来,由 GetStdHandle 返回的句柄应该是不支持 ReadConsole 的。不过,我并没有再测试 ReadConsoleInput ,有兴趣的朋友们可以自己测试一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值