/*********本程序使用匿名管道pipe实现父子间进程通信********
**********在此展示了父进程建立匿名管道PIPE,建立子进程,并将子进程设置为
**********匿名管道的输入端,父进程作为匿名管道的读取端,并在循环内讲数据
**********完成从子进程到父进程的传递。*/
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define CREATE_PIPE_FAILED 1
#define GET_STDOUTPUT_FAILED 2
#define SET_STDOUTPUT_TOPIPE_FAILED 3
#define CREATE_PROCESS_FAILED 4
int main(int argc, char *argv[])
{
HANDLE hRead;
HANDLE hWrite;
STARTUPINFO si;
PROCESS_INFORMATION pi;
char szReadBuf[100];
DWORD nReadNum;
DWORD nOut;
BOOL bRet;
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE; //必须为TRUE,父进程的读写句柄可以被子进程继承
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
//创建匿名管道
bRet = CreatePipe(&hRead, &hWrite, &sa, 0);
if (bRet)
{
printf("成功创建匿名管道!\n");
}
else
{
printf("创建匿名管道失败!错误码:[%d]\n", GetLastError());
return CREATE_PIPE_FAILED;
}
//获取STARTUPINFO结构体信息
GetStartupInfo(&si);
//设置STARTUPINFO的标准输出到管道入口,要使标准输入输出有效,必须指定STARTF_USESTDHANDLES
//实际上这段代码的意思是设置管道并且对管道的输出(输入)进行重定向
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hWrite;
si.hStdError = hWrite;
LPTSTR szCmdline = _tcsdup(TEXT("client.exe"));
//创建子进程
bRet = CreateProcess(NULL, szCmdline, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);
if (!bRet)
{
printf("创建子进程失败!错误码:[%d]\n", GetLastError());
return CREATE_PROCESS_FAILED;
}
else
{
printf("成功创建子进程\n");
Sleep(3000);
}
CloseHandle(hWrite);
LPTSTR helloTxt = _tcsdup(TEXT("outputFile.txt"));
HANDLE hout = CreateFile(helloTxt, GENERIC_ALL, FILE_SHARE_WRITE, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
//读取管道中的数据
int i = 0;
while (ReadFile(hRead, szReadBuf, 100, &nReadNum, NULL))
{
WriteFile(hout, szReadBuf, nReadNum, &nOut, NULL);
i++;
}
printf("%d", i);
//释放创建子进程的资源
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
getchar();
return 0;
}
/***此子进程主要使用windowsAPI的writefile readfile createfile 函数,
****使用GetSTDHandle获取标准输出或者输入的句柄,
****对标准输出或者输入进行重定向
****主要参考资料MSDN,windows系统编程p245和
****http://blog.chinaunix.net/uid-28300131-id-3391466.html*/
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <tchar.h>
using namespace std;
void main()
{
HANDLE hRead;
char szReadBuf[100];
DWORD nIn,nOut;
LPTSTR inputFile = _tcsdup(TEXT("hello_Pipe.txt"));
//获取标准输出的句柄,对标准输出进行重定向
HANDLE hWrite = GetStdHandle(STD_OUTPUT_HANDLE);
//使用windowsAPI打开已建立的TXT文件
hRead = CreateFile(inputFile, GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
//在循环内读取TXT,直到读取完成
while (ReadFile(hRead, szReadBuf, 100, &nIn, NULL) && nIn > 0)
{
WriteFile(hWrite, szReadBuf, nIn, &nOut, NULL);
}
ExitProcess(0);
}
使用windowsAPI穿件匿名管道pipe,父子进程间数据传递
最新推荐文章于 2021-06-10 10:56:29 发布