C语言创建管道实现进程间通信

来源:互联网 发布:我的世界网络错误 编辑:程序博客网 时间:2024/06/04 00:36
#include <windows.h>#include <stdio.h>#include <stdlib.h>int runcmd( char* lpCmd ){    char buf[2048] = {0};    //缓冲区    DWORD len;    HANDLE hRead, hWrite;    // 管道读写句柄    STARTUPINFO si;    PROCESS_INFORMATION pi;    SECURITY_ATTRIBUTES sa;        //ZeroMemory( buf, 2047 );    sa.nLength = sizeof( sa );    sa.bInheritHandle = TRUE;    // 管道句柄是可被继承的    sa.lpSecurityDescriptor = NULL;        // 创建匿名管道,管道句柄是可被继承的    if( !CreatePipe( &hRead, &hWrite, &sa, 2048 ) )    {        printf( "管道创建失败!(%#X)\n", (unsigned int)GetLastError() );        return 1;    }    ZeroMemory( &si, sizeof( si ) );    si.cb = sizeof( si );    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;    si.wShowWindow = SW_HIDE;    si.hStdError = hWrite;    si.hStdOutput = hWrite;    // 创建子进程,运行命令,子进程是可继承的    if ( !CreateProcess( NULL, lpCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ) )    {        printf( "创建进程失败!(%#x)\n", (unsigned int)GetLastError() );        CloseHandle( hRead );        CloseHandle( hWrite );        return 1;    }    // 写端句柄已被继承,本地需要关闭,不然读管道时将被阻塞    CloseHandle( hWrite );    // 读管道内容,并显示    while ( ReadFile( hRead, buf, 2047, &len, NULL ) )    {        printf( buf );        ZeroMemory( buf, 2047 );    }    CloseHandle( hRead );    return 0;}int main( int argc, char** argv ){      char cmd[256];      printf( "输入命令行:" );      gets( cmd );      runcmd( cmd );      system( "pause" );      return 0;}