Windows管道与StdIn、StdOut重定向

stdin是标准输入,stdout是标准输出,stderr是标准错误输出。大多数的命令行程序从stdin输入,输出到stdout或stderr,有时我们需要重定向stdout,stderr,stdin。比如:将输出写入文件,又或者我们要将命令行程序输出结果显示到Windows对话框中。

在Windows编程中,重定向需要用到管道(Pipe)的概念。管道是一种用于在进程间共享数据的机制。一个管道类似于一个管子的两端,一端是写入的,一端是读出的。由一个进程从写入端写入、另一个进程从读出端读出,从而实现通信,就向一个“管道”一样。

重定向的原理是:

首先声明两个概念:主程序(重定向的操纵者)、子进程(被重定向的子进程)

  • 如果要重定向stdout的话,先生成一个管道, 管道的写入端交给子进程去写,主程序从管道的读出端读数据,然后可以把数据写成文件、显示等等。重定向stderr和stdout是相同的。
  • 同理,要重定向stdin的话,生成一个管道, 管道的写入端由主程序写,子进程从管道的读出端读数据。

下面是一个输出重定向的例子:将一个命令行Ping的结果展示在编辑框里。

核心代码如下:

#define MSG_DATAREC WM_USER +0x400

BEGIN_MESSAGE_MAP(CStudyStdOut_RedirectGuiDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON1, &CStudyStdOut_RedirectGuiDlg::OnBnClickedButton1)
	ON_MESSAGE(MSG_DATAREC,&CStudyStdOut_RedirectGuiDlg::OnDataRec)
END_MESSAGE_MAP()

void CStudyStdOut_RedirectGuiDlg::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here
	SECURITY_ATTRIBUTES sa;
	ZeroMemory(&sa,sizeof(sa));
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;  //默认的安全描述符
	sa.bInheritHandle = TRUE;        //这个必须要设定TRUE,参考资料:《windows核心编程》第三章
	HANDLE hRead, hWrite;

	if( !CreatePipe(&hRead, &hWrite, &sa, 0) )
	{
		MessageBox(" CreatePipe return FALSE.");
		return;
	}  

	m_hReadPipe = hRead;
	AfxBeginThread(ReadPipeProc,this,NULL);

	STARTUPINFO siStartInfo;
	PROCESS_INFORMATION piProcInfo;
	ZeroMemory(&siStartInfo,sizeof(STARTUPINFO));
	siStartInfo.cb =sizeof(STARTUPINFO);
	siStartInfo.dwFlags  |= STARTF_USESHOWWINDOW;
	siStartInfo.dwFlags  |= STARTF_USESTDHANDLES;
	siStartInfo.hStdOutput = hWrite;
	siStartInfo.hStdError  = hWrite;

	TCHAR szCmdPar[256] = "ping www.baidu.com";
	if(!CreateProcess(NULL, szCmdPar,NULL,NULL,TRUE,NULL,NULL,NULL,&siStartInfo, &piProcInfo))
	{
		MessageBox("CreateProcess failed!");
		return;
	}

	CloseHandle(piProcInfo.hProcess);
	CloseHandle(piProcInfo.hThread);

}

UINT ReadPipeProc( LPVOID pParam )
{
	CStudyStdOut_RedirectGuiDlg * pAttachWnd = static_cast<CStudyStdOut_RedirectGuiDlg *>(pParam);
	HANDLE hRead = pAttachWnd->m_hReadPipe;
	HWND   hWnd  = pAttachWnd->GetSafeHwnd();  

	DWORD bytesRead;
	while( 1 )
	{
		int len = sizeof(pAttachWnd->m_szData);
		ZeroMemory(&pAttachWnd->m_szData,len);  

		if( !ReadFile(hRead, pAttachWnd->m_szData, len-1, &bytesRead, NULL) )
			break;  

		SendMessage(hWnd,MSG_DATAREC,0,0);
	}  

	return 0;
}
HRESULT CStudyStdOut_RedirectGuiDlg::OnDataRec( WPARAM wParam, LPARAM lParam )
{
	m_strEdit += m_szData;
	UpdateData(FALSE);
	return 1;
}
时间: 2024-10-21 22:33:42

Windows管道与StdIn、StdOut重定向的相关文章

Linux学习笔记 -- stdin/stdout 重定向

输入/输出重定向 Linux系统通常从一个叫标准输入的地方读取输入并且将一个命令的结果以写入到标准输出反馈给我们:默认情况下,这也是我们使用的终端(命令行).如果我们想改变输入和输出的方式,就需要使用重定向.通常重定向命令有如下几种方式: 命令 说明 command > file 将输出重定向到 file. command < file 将输入重定向到 file. command >> file 将输出以追加的方式重定向到 file. n > file 将文件描述符为 n 的

WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)

WorkerMan中work.php中 resetStd 方法中代码如下 public static function resetStd() { if (!static::$daemonize || static::$_OS !== 'linux') { return; } global $STDOUT, $STDERR; $handle = fopen(static::$stdoutFile, "a"); if ($handle) { unset($handle); //关闭标准输出

管道和I/O重定向

I/O即输入输出,在linux中标准的输入输出设备为键盘和显示器,当我们执行一条命令时,默认的输出结果会显示在屏幕上,如果我们不想让它显示在屏幕上时,就需要使用输出重定向来让它显示在其他设备或保存在某个文件中. 重定向即修改默认的输入输出设备为其他设备或文件: 命令执行过程的数据传输情况 当我们执行一个命令的时候,会由文件读取数据,经过处理后,再将结果输出到屏幕:Standard Output和Standard Output Error分别代表标准输出和标准错误输出: 在linux系统中,所有的

C++ stderr/stdout 重定向到文件

通常,stderr和stdout被用来输出内容显示到屏幕,但是,有时候我们需要把这些信息写到指定的文件,方便随时查阅.最简单的实现方式就是,把 stderr/stdout 的输出重定向到文件. stderr/stdout 重定向到文件 这里以stderr代码说明. #include <stdio.h> #include <stdlib.h> int main( void ) { FILE *stream = freopen( "freopen.out", &qu

重定向stdin stdout stderr |

在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据 流,也就是题目中所提到的这三个.那么什么是数据流呢(stream)? 我们知道,一个程序要运行,需要有输入.输出,如果出错,还要能表现出自身的错误.这是就要从某个地方读入数据.将数据输出到某个地方,这就够成了数据流. 执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘:标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕.进程将从标

【转】stdin, stdout, stderr 以及重定向

详细见: http://my.oschina.net/qihh/blog/55308 stdin是标准输入文件,stdout是标准输出文件,stderr标准出错文件. 程序按如下方式使用这些文件: 标准输入是程序可以读取其输入的位置.缺省情况下,进程从键盘读取 stdin . 标准输出是程序写入其输出的位置.缺省情况下,进程将 stdout 写到终端屏幕上. 标准错误是程序写入其错误消息的位置.缺省情况下,进程将 stderr 写到终端屏幕上.

以冒泡排序为例--malloc/free 重定向stdin stdout

esort.c 代码如下,可关注下mallloc/free,freopen重定向的用法,排序为每轮将最小的数放在最前面: 1 #include<stdio.h> 2 #include<malloc.h> 3 4 #define N 8 5 6 void datin(int *p); 7 void printout(int *p,int len); 8 void esort(int p[]); 9 10 int main(void) 11 { 12 int len=0; 13 int

linux 输入--输出--重定向 stdin/stdout/stderr

重定向 shell编辑文本 图形化工具编辑文件   1.重定向     标准输入     标准输出     错误输出 [[email protected] kkk]# cat aaa.sh #!/bin/bash a=1 while [ $a -le 5 ] do useradd user$a let a++ done [[email protected] kkk]# ./aaa.sh [[email protected] kkk]# tail /etc/passwd tcpdump:x:72:

Linux命令(九)管道和I/O重定向&gt;、&gt;&gt;、2&gt;、2&gt;&gt;、&amp;&gt;、&lt;、&lt;&lt;、tee

重定向:> < >> << 运算器.控制器: CPU存储器:RAM输入设备/输出设备 程序:指令和数据 控制器:指令运算器:存储器: 地址总线:内存寻址数据总线:传输数据控制总结:控制指令 寄存器:CPU暂时存储器 I/O: 硬盘, 程序 INPUT设备: OUTPUT设备 系统设定    默认输出设备:标准输出,STDOUT, 1    默认输入设备:标准输入, STDIN, 0    标准错误输出:STDERR, 2    标准输入:键盘标准输出和错误输出:显示器