使用windowsAPI穿件匿名管道pipe,父子进程间数据传递

/*********本程序使用匿名管道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);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值