要求很简单:一个父子进程的程序,父进程通过pipe向子进程发送乘数和被乘数,子进程计算它们的值并输出到屏幕上.我已经建立了管道(CreatePipe)和子进程( CreateProcess).
但是对管道操作流程很糊涂.问题是:
1.如果要完成这个问题,流程是不是这样:建一个管道,父进程写一个数到管道里,子进程读出来,然后管道关闭,然后父进程再建一个管道,再传一个数,子进程接收后,关闭管道.然后子进程计算结果,显示在屏幕上。如果是这样的一个流程,好象效率也太低了。2.是不是子进程计算出来的结果必须传回父进程才能显示在屏幕上?
但是对管道操作流程很糊涂.问题是:
1.如果要完成这个问题,流程是不是这样:建一个管道,父进程写一个数到管道里,子进程读出来,然后管道关闭,然后父进程再建一个管道,再传一个数,子进程接收后,关闭管道.然后子进程计算结果,显示在屏幕上。如果是这样的一个流程,好象效率也太低了。2.是不是子进程计算出来的结果必须传回父进程才能显示在屏幕上?
文章是将把子进程运行的结果,在父进程中显示。看过MSDN,好象管道应该用在批量数据的通信,不适合多次通信的问题。.
一般管道比较适合单向的数据重定向,如编译程序等,确实不适合双向的数据频繁交换进程间通讯方式有很多,没有必要一定用管道吧,用socekt,WM_COPYDATA等都可以通讯的
我程序中的一段代码,我没做改动,直接贴过来了.你看看,希望能有所帮助.我是在当前程序中新建一个进程,然后从文件中读取输入,并将输出写入另一个文件.
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);
}