windows父子进程交互的一个例子

父进程创建子进程,然后子进程的窗口是隐藏的,子进程需要从标准输入读取输入。所以需要从父进程的控制台读入后传递给子进程。

msdn上有个例子,主要是用spawnvp函数创建子进程,并传递参数给子进程,然后父子进程通过管道交互,把标准输入定向到管道。

 

spawnvp 函数的说明,可以查看msdn。

 

下面是msdn上的例子代码。

Example 1 /* PIPE.C: This program uses the _pipe function to pass streams of * text to spawned processes. */ #include #include #include #include #include #include enum PIPES { READ, WRITE }; /* Constants 0 and 1 for READ and WRITE */ #define NUMPROBLEM 8 void main( int argc, char *argv[] ) { int hpipe[2]; char hstr[20]; int pid, problem, c; int termstat; /* If no arguments, this is the spawning process */ if( argc == 1 ) { setvbuf( stdout, NULL, _IONBF, 0 ); /* Open a set of pipes */ if( _pipe( hpipe, 256, O_BINARY ) == -1 ) exit( 1 ); /* Convert pipe read handle to string and pass as argument * to spawned program. Program spawns itself (argv[0]). */ itoa( hpipe[READ], hstr, 10 ); if( ( pid = spawnl( P_NOWAIT, argv[0], argv[0], hstr, NULL ) ) == -1 ) printf( "Spawn failed" ); /* Put problem in write pipe. Since spawned program is * running simultaneously, first solutions may be done * before last problem is given. */ for( problem = 1000; problem <= NUMPROBLEM * 1000; problem += 1000) { printf( "Son, what is the square root of %d?/n", problem ); write( hpipe[WRITE], (char *)&problem, sizeof( int ) ); } /* Wait until spawned program is done processing. */ _cwait( &termstat, pid, WAIT_CHILD ); if( termstat & 0x0 ) printf( "Child failed/n" ); close( hpipe[READ] ); close( hpipe[WRITE] ); } /* If there is an argument, this must be the spawned process. */ else { /* Convert passed string handle to integer handle. */ hpipe[READ] = atoi( argv[1] ); /* Read problem from pipe and calculate solution. */ for( c = 0; c < NUMPROBLEM; c++ ) { read( hpipe[READ], (char *)&problem, sizeof( int ) ); printf( "Dad, the square root of %d is %3.2f./n", problem, sqrt( ( double )problem ) ); } } } Output Son, what is the square root of 1000? Son, what is the square root of 2000? Son, what is the square root of 3000? Son, what is the square root of 4000? Son, what is the square root of 5000? Son, what is the square root of 6000? Son, what is the square root of 7000? Son, what is the square root of 8000? Dad, the square root of 1000 is 31.62. Dad, the square root of 2000 is 44.72. Dad, the square root of 3000 is 54.77. Dad, the square root of 4000 is 63.25. Dad, the square root of 5000 is 70.71. Dad, the square root of 6000 is 77.46. Dad, the square root of 7000 is 83.67. Dad, the square root of 8000 is 89.44. Example 2 // This is a simple filter application. It will spawn // the application on command line. But before spawning // the application, it will create a pipe that will direct the // spawned application's stdout to the filter. The filter // will remove ASCII 7 (beep) characters. // Beeper.Cpp /* Compile options needed: None */ #include #include int main() { int i; for(i=0;i<100;++i) { printf("/nThis is speaker beep number %d... /n/7", i+1); } return 0; } // BeepFilter.Cpp /* Compile options needed: none Execute as: BeepFilter.exe Beeper.exe */ #include #include #include #include #include #include #include #define OUT_BUFF_SIZE 512 #define READ_HANDLE 0 #define WRITE_HANDLE 1 #define BEEP_CHAR 7 char szBuffer[OUT_BUFF_SIZE]; int Filter(char* szBuff, ULONG nSize, int nChar) { char* szPos = szBuff + nSize -1; char* szEnd = szPos; int nRet = nSize; while (szPos > szBuff) { if (*szPos == nChar) { memmove(szPos, szPos+1, szEnd - szPos); --nRet; } --szPos; } return nRet; } int main(int argc, char** argv) { int nExitCode = STILL_ACTIVE; if (argc >= 2) { HANDLE hProcess; int hStdOut; int hStdOutPipe[2]; // Create the pipe if(_pipe(hStdOutPipe, 512, O_BINARY | O_NOINHERIT) == -1) return 1; // Duplicate stdout handle (next line will close original) hStdOut = _dup(_fileno(stdout)); // Duplicate write end of pipe to stdout handle if(_dup2(hStdOutPipe[WRITE_HANDLE], _fileno(stdout)) != 0) return 2; // Close original write end of pipe close(hStdOutPipe[WRITE_HANDLE]); // Spawn process hProcess = (HANDLE)spawnvp(P_NOWAIT, argv[1], (const char* const*)&argv[1]); // Duplicate copy of original stdout back into stdout if(_dup2(hStdOut, _fileno(stdout)) != 0) return 3; // Close duplicate copy of original stdout close(hStdOut); if(hProcess) { int nOutRead; while (nExitCode == STILL_ACTIVE) { nOutRead = read(hStdOutPipe[READ_HANDLE], szBuffer, OUT_BUFF_SIZE); if(nOutRead) { nOutRead = Filter(szBuffer, nOutRead, BEEP_CHAR); fwrite(szBuffer, 1, nOutRead, stdout); } if(!GetExitCodeProcess(hProcess,(unsigned long*)&nExitCode)) return 4; } } } printf("/nPress /'ENTER/' key to continue... "); getchar(); return nExitCode; }   

 

你可能感兴趣的:(C/C++)