家庭服务器系统编程,Windows系统编程之进程间通信

代码:

#include 

#include 

const int BUFSIZE = 4096 ;

HANDLE  hChildStdinRd, hChildStdinWr, hChildStdinWrDup,

hChildStdoutRd,hChildStdoutWr,hChildStdoutRdDup,

hSaveStdin,    hSaveStdout;

BOOL CreateChildProcess(LPTSTR);

VOID WriteToPipe(LPTSTR);

VOID ReadFromPipe(LPTSTR);

VOID ErrorExit(LPTSTR);

VOID ErrMsg(LPTSTR, BOOL);

void main( int argc, char *argv[] )

{

// 处理输入参数

if ( argc != 4 )

return ;

// 分别用来保存命令行,输入文件名(CPP/C),输出文件名(保存编译信息)

LPTSTR lpProgram = new char[ strlen(argv[1]) ] ;

strcpy ( lpProgram, argv[1] ) ;

LPTSTR lpInputFile = new char[ strlen(argv[2]) ];

strcpy ( lpInputFile, argv[2] ) ;

LPTSTR lpOutputFile = new char[ strlen(argv[3]) ] ;

strcpy ( lpOutputFile, argv[3] ) ;

SECURITY_ATTRIBUTES saAttr;

saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);

saAttr.bInheritHandle = TRUE;

saAttr.lpSecurityDescriptor = NULL;

/************************************************

*    redirecting child process's STDOUT  *

************************************************/

hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);

if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0))

ErrorExit("Stdout pipe creation failed\n");

if (! SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr))

ErrorExit("Redirecting STDOUT failed");

BOOL fSuccess = DuplicateHandle(

GetCurrentProcess(),

hChildStdoutRd,

GetCurrentProcess(),

&hChildStdoutRdDup ,

0,

FALSE,

DUPLICATE_SAME_ACCESS);

if( !fSuccess )

ErrorExit("DuplicateHandle failed");

CloseHandle(hChildStdoutRd);

/************************************************

*    redirecting child process's STDIN    *

************************************************/

hSaveStdin = GetStdHandle(STD_INPUT_HANDLE);

if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0))

ErrorExit("Stdin pipe creation failed\n");

if (! SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd))

ErrorExit("Redirecting Stdin failed");

fSuccess = DuplicateHandle(

GetCurrentProcess(),

hChildStdinWr,

GetCurrentProcess(),

&hChildStdinWrDup,

0,

FALSE,

DUPLICATE_SAME_ACCESS);

if (! fSuccess)

ErrorExit("DuplicateHandle failed");

CloseHandle(hChildStdinWr);

/************************************************

*      创建子进程(即启动SAMPLE.EXE)    *

************************************************/

fSuccess = CreateChildProcess( lpProgram );

if ( !fSuccess )

ErrorExit("Create process failed");

// 父进程输入输出流的还原设置

if (! SetStdHandle(STD_INPUT_HANDLE, hSaveStdin))

ErrorExit("Re-redirecting Stdin failed\n");

if (! SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout))

ErrorExit("Re-redirecting Stdout failed\n");

WriteToPipe( lpInputFile ) ;

ReadFromPipe( lpOutputFile );

delete lpProgram ;

delete lpInputFile ;

delete lpOutputFile ;

}

BOOL CreateChildProcess( LPTSTR lpProgram )

{

PROCESS_INFORMATION piProcInfo;

STARTUPINFO siStartInfo;

BOOL bFuncRetn = FALSE;

ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );

ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );

siStartInfo.cb = sizeof(STARTUPINFO);

bFuncRetn = CreateProcess ( NULL, lpProgram, NULL, NULL, TRUE, \

0, NULL, NULL, &siStartInfo, &piProcInfo);

if (bFuncRetn == 0)

{

ErrorExit("CreateProcess failed\n");

return 0;

}

else

{

CloseHandle(piProcInfo.hProcess);

CloseHandle(piProcInfo.hThread);

return bFuncRetn;

}

}

VOID WriteToPipe( LPTSTR lpInputFile )

{

HANDLE hInputFile = CreateFile(lpInputFile, GENERIC_READ, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);

if (hInputFile == INVALID_HANDLE_VALUE)

return ;

BOOL fSuccess ;

DWORD dwRead, dwWritten;

CHAR chBuf[BUFSIZE] = {0} ;

for (;;)

{

fSuccess = ReadFile( hInputFile, chBuf, BUFSIZE, &dwRead, NULL) ;

if ( !fSuccess || dwRead == 0)

break;

fSuccess = WriteFile( hChildStdinWrDup, chBuf, dwRead, &dwWritten, NULL) ;

if ( !fSuccess )

break;

}

if (! CloseHandle(hChildStdinWrDup))

ErrorExit("Close pipe failed\n");

CloseHandle ( hInputFile ) ;

}

VOID ReadFromPipe( LPTSTR lpOutputFile )

{

HANDLE hOutputFile = CreateFile( lpOutputFile, GENERIC_READ|GENERIC_WRITE,

FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hOutputFile == INVALID_HANDLE_VALUE)

return ;

BOOL fSuccess ;

DWORD dwRead, dwWritten;

CHAR chBuf[BUFSIZE] = { 0 };

if (!CloseHandle(hChildStdoutWr))

ErrorExit("Closing handle failed");

for (;;)

{

fSuccess = ReadFile( hChildStdoutRdDup, chBuf, BUFSIZE, &dwRead, NULL) ;

if( !fSuccess || dwRead == 0)

{

break;

}

fSuccess = WriteFile( hOutputFile, chBuf, dwRead, &dwWritten, NULL) ;

if ( !fSuccess )

break;

}

CloseHandle ( hOutputFile ) ;

}

VOID ErrorExit (LPTSTR lpszMessage)

{

MessageBox( 0, lpszMessage, 0, 0 );

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值