要求很简单:一个父子进程的程序,父进程通过pipe向子进程发送乘数和被乘数,子进程计算它们的值并输出到屏幕上.我已经建立了管道(CreatePipe)和子进程( CreateProcess).
但是对管道操作流程很糊涂.问题是:
1.如果要完成这个问题,流程是不是这样:建一个管道,父进程写一个数到管道里,子进程读出来,然后管道关闭,然后父进程再建一个管道,再传一个数,子进程接收后,关闭管道.然后子进程计算结果,显示在屏幕上。如果是这样的一个流程,好象效率也太低了。2.是不是子进程计算出来的结果必须传回父进程才能显示在屏幕上?

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=1097
      

  2.   

    谢谢你。看过这个文章了。
    文章是将把子进程运行的结果,在父进程中显示。看过MSDN,好象管道应该用在批量数据的通信,不适合多次通信的问题。.
      

  3.   

    1 父进程和子进程中需要有一个线程不停的读取管道输出,子进程还要对读取的数据解析,大概流程应该和你说的差不多2 看你的子进程是什么样的了,一般子进程都是隐藏的,所以需要把数据通过管道传入父进程进行显示。
    一般管道比较适合单向的数据重定向,如编译程序等,确实不适合双向的数据频繁交换进程间通讯方式有很多,没有必要一定用管道吧,用socekt,WM_COPYDATA等都可以通讯的
      

  4.   

    一般是这样的结构:输入--->进程-->输出.箭头表示匿名管道.也就是说,输入需要一个管道,输出也需要一个管道.一旦输入管道打开,就可以一直往里面写数据,无需重新打开管道.
    我程序中的一段代码,我没做改动,直接贴过来了.你看看,希望能有所帮助.我是在当前程序中新建一个进程,然后从文件中读取输入,并将输出写入另一个文件.
    char inFile[64],outFile[64];
    SECURITY_ATTRIBUTES sa,sa2;
    HANDLE hInputRead,hInputWrite,hOutputRead,hOutputWrite;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;

        if (!CreatePipe(&hInputRead,&hInputWrite,&sa,0))
        {
    printf("Error creating input pipe\n");
    return 7;
        }

    sa2.nLength=sizeof(SECURITY_ATTRIBUTES);
    sa2.lpSecurityDescriptor=NULL;
    sa2.bInheritHandle=TRUE;

    if(!CreatePipe(&hOutputRead,&hOutputWrite,&sa2,0))
    {
    printf("Error creating output pipe\n");
    return 7;
    }
    ////////////////////////////////////////////
    PROCESS_INFORMATION pi;
    STARTUPINFO si; GetStartupInfo(&si);
    si.cb=sizeof(STARTUPINFO);
    //redirect stdin,stdout and stderr
    si.hStdError = hOutputWrite;
    si.hStdOutput = hOutputWrite;
    si.hStdInput = hInputRead; si.wShowWindow=SW_HIDE;
    si.dwFlags =  STARTF_USESTDHANDLES /*STARTF_USESHOWWINDOW*/;

    p->time=0;p->memory=0; char buffer[1024]={0},tmp[80]={0};
    if(CreateProcess(appName,NULL,
    NULL,NULL,TRUE,
    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,
    NULL,NULL,&si,&pi))
    {
    p->pid=pi.dwProcessId;
    //read data from input file

    //get input filename
    getInputFile(appName,inFile); FILE *fp;
    if((fp=fopen(inFile,"r"))==NULL)
    {
    printf("Error opening input file");
    return 7;
    }
    while(!feof(fp))
    {
    fgets(tmp,80,fp);
    strcat(buffer,tmp);
    }
    fclose(fp);

    int len=strlen(buffer);
    //the '\n' may be essential as it indicates end of input
    buffer[len]=0;
    //printf("Buffer content:%s",buffer);

    DWORD bytesRead;
      
    CloseHandle(hInputRead);
    CloseHandle(hOutputWrite);
     
    if(WriteFile(hInputWrite,buffer,len+1,&bytesRead,NULL)==NULL)
    {
    printf("Nothing written\n");
    return 7;
    }
    memset(buffer,0,1024*sizeof(char)); //get output filename
    getOutputFile(appName,outFile); if((fp=fopen(outFile,"w"))==NULL)
    {
    printf("Error opening output file");
    return 7;
    }

    while (true) 
    {
    memset(tmp,0,80*sizeof(char));
    if(ReadFile(hOutputRead,tmp,80,&bytesRead,NULL)==NULL)
    break;
    strcat(buffer,tmp);
    }
    buffer[strlen(buffer)]=0;
    printf("Buffer size:%d\n",strlen(buffer));
    //test if ole
    if(strlen(buffer)>10*1024)
    {
    fclose(fp);
    return 5;
    } fprintf(fp,"%s",buffer);
    fclose(fp); CloseHandle(hInputWrite);
    CloseHandle(hOutputRead);
    }