示例程序: /* Name: 3745739.c Copyright: iDLER FANG Author: iDLER FANG Date: 22-01-05 22:56 Description: Sample of child process I/O redirect. */
#include <stdio.h> #include <stdlib.h>
#include <windows.h>
#define BUFFSIZE 4096
int main(int argc, char *argv[]) { const char* lpszCmd = "test.exe"; /* 以下为创建匿名管道所需的参数 */ HANDLE hReadPipe, /* 读管道 */ hWritePipe; /* 写管道 */ SECURITY_ATTRIBUTES sec_attr; /* 安全属性 */ /* 以下为创建子进程需要的参数 */ STARTUPINFO start_info; PROCESS_INFORMATION proc_info; char buff[BUFFSIZE]; /* 缓冲区 */ DWORD bytesRead; const int interval = 100; /* 更新间隔 */ /* 创建匿名管道 */ sec_attr.bInheritHandle = TRUE; /* 保证管道能够被子进程继承 */ sec_attr.nLength = sizeof(SECURITY_ATTRIBUTES); sec_attr.lpSecurityDescriptor = NULL; /* 使用系统默认的安全描述符 */ if (CreatePipe(&hReadPipe, &hWritePipe, &sec_attr, 0) == 0) { fprintf(stderr, "Anonymous pipe creation failed!\n"); return -1; } /* 创建子进程 */ start_info.cb = sizeof(STARTUPINFO); GetStartupInfo(&start_info); start_info.hStdOutput = hWritePipe; /* 重定向stdout */ start_info.hStdError = hWritePipe; /* 重定向stderr */ start_info.wShowWindow = SW_HIDE; /* 当然,不显示窗口 */ start_info.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; /* 使以上参数生效 */ if (CreateProcess(NULL, TEXT(lpszCmd), NULL, NULL, TRUE, NULL, NULL, NULL, &start_info, &proc_info) == 0) { fprintf(stderr, "Child process creation failed!\n"); return -1; } CloseHandle(hWritePipe); /* 当前进程并不需要这个写入端 */ /* 从hReadPipe读入 */ for(;;) { if (ReadFile(hReadPipe, buff, BUFFSIZE - 1, &bytesRead, NULL) == NULL) break; printf("%s", buff); Sleep(interval); }
system("PAUSE"); return 0; }
test.c #include <stdio.h> #include <stdlib.h>
#include <windows.h>
int main(int argc, char *argv[]) { const int times = 10; const int interval = 1000; int i; for (i = 0; i < times; i++) { fprintf(stdout, "i = %d\n", i); fflush(stdout); Sleep(interval); }
return 0; } 
|