win管道进程与控制台程序间通信

#include <stdio.h>
#include <Windows.h>

int  main() {
	//创建管道
	HANDLE hChildStdoutRd, hChildStdoutWr;	//管道两端的句柄
	//管道的属性
	SECURITY_ATTRIBUTES la;
	la.nLength = sizeof(la);
	la.bInheritHandle = TRUE;
	la.lpSecurityDescriptor = NULL; //NULL为默认值

	//创建管道
	BOOL bCreate = CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &la, 0);
	if (!bCreate) {
		MessageBox(0, "CreatePipe error", 0, 0);
		return 1;
	}

	//创建子进程
	char cmd[] = "ping baidu.com";

	STARTUPINFO si;
	ZeroMemory(&si, sizeof(si));

	PROCESS_INFORMATION pi;
	
	si.cb = sizeof(si);
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;	//子进程窗口的句柄使用标准
	si.hStdOutput = hChildStdoutWr;			//将子进程的标准输出信息,输出到管道的写段
	si.hStdError = hChildStdoutWr;			//将子进程的标准输出信息,输出到管道的写段

	//
	BOOL bCreateP = CreateProcessA(
		NULL, 
		cmd,		//使用命令行
		NULL, 
		NULL, 
		TRUE,		//继承
		0, 
		NULL,
		NULL, 
		&si,		//子进程启动的时候的一些配置信息
		&pi);		//
	if (!bCreateP)
	{
		printf("CreateProcessA error: %d", GetLastError());
	}

	char buffRead[1024];
	DWORD size_r;

	//此处是忙式循环检测管道内是否由数据,有数据立即就会读出来
	while (true)
	{
		BOOL bR = ReadFile(hChildStdoutRd, buffRead, sizeof(buffRead), &size_r, NULL);
		buffRead[size_r] = '\0';	//输出到屏幕的程序,一般是不会将'\0'输出到屏幕上的(除非我们自己写时自己输出上),所以我们读取要加上字符串结束符'\0';
		if (!bR)
		{
			printf("ReadFile error: %d;\n", GetLastError());
		}
		printf("read size: %d =====:[%s]\n", size_r, buffRead);
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值