您的位置:首页 > 其它

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

2014-11-01 14:34 337 查看
/***************************************************************************

基于管道的进程间通信

功能说明:

本程序用于判断某目录下存放的若干个求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
= 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查找,每个函数都会有对应的详细操作

最近忙着做各种东西没发表,发一篇水水
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: