#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;
}