操作系统利用管道通信来批量判断程序结果的正确与否

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


基于管道的进程间通信
功能说明:
本程序用于判断某目录下存放的若干个求n!的程序是否正确。
这些求n!的程序都从其标准输入读入一个整数输入值n,计算出结果后,
再往标准输出打印出结果对应的整数。






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






#include <windows.h>
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include <cstring>
#define MAXLINE 4096




BOOL CreateChildProcess(char * szCmdline);
/**********************************************************************
d:\exe目录下存放了若干个求n!的.exe文件


**********************************************************************/
char * EXE_DIR = "d:\\exe";
//父进程发给子进程的测试数据
char NUM[] = "6\n";
//子进程返回给父进程的应是"720",因为6!=720
#define ANSWER 720
//
PROCESS_INFORMATION piProcInfo;
//存管道的读句柄
HANDLE RD = NULL;
//存管道的写句柄
HANDLE WR = NULL;




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


@param  char * dir   形如 d:\data


********************************************************************/
void judge(char * dir){
HANDLE hFile;
WIN32_FIND_DATA fd;
BOOL bRet = TRUE;
bRet = TRUE;
//path中存放形如d:\data\*
char path[MAXLINE];
strcpy(path,dir);
strcat(path,"\\*");
//name中存放形如d:\data\1.exe
char name[MAXLINE];


hFile = FindFirstFile(path, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
if(strncmp(fd.cFileName,".",1) != 0){
strcpy(name,dir);
strcat(name,"\\");
strcat(name,fd.cFileName);
//printf("%s\n",name);
DWORD n;
if(CreateChildProcess(name)){
//*******************************************
char buf[1024] ;
WriteFile(WR,"6\n",2,&n,NULL) ;
WaitForSingleObject(piProcInfo.hProcess,INFINITE);
ReadFile(RD,buf,1024,&n,NULL) ;
buf[n] = 0;
printf("%s,%d\n",buf,n) ;
int answer=atoi(buf);
if(  answer == 720)
{ printf(" right " ) ; }
else 
{ printf(" wrong "); }


CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);

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

}else{
perror("CreateChildProcess fails.\n");
}
}
bRet = FindNextFile(hFile, &fd);
}

}




int main(){



ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
SECURITY_ATTRIBUTES saAttr; 
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL; 


if (! CreatePipe(&RD, &WR,&saAttr, 0)){
perror("CreatePipe failed.");
return 0;
}
printf("各个程序求6!的结果为:\n");
judge(EXE_DIR);
return 0;
}




BOOL CreateChildProcess(char * szCmdline){ 




STARTUPINFO siStartInfo;


ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO); 
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
    siStartInfo.hStdInput = RD;
siStartInfo.hStdOutput = WR;
siStartInfo.hStdError = WR;




return CreateProcess(NULL, 
szCmdline,     // command line 
NULL,          // process security attributes 
NULL,          // primary thread security attributes 
TRUE,          // handles are inherited 
0,             // creation flags 
NULL,          // use parent's environment 
NULL,          // use parent's current directory 
&siStartInfo,  // STARTUPINFO pointer 
&piProcInfo);  // receives PROCESS_INFORMATION 

}



主要是操作系统课老师给的一些填空内容,其中有个地方没接触过,atoi,C语言里的一个函数,用处是把字符串转换成整形的,不同于强制转换,写入写出在windows操作平台下可以通过MSDN查找,每个函数都会有对应的详细操作

最近忙着做各种东西没发表,发一篇水水






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值