/***************************************************************************
基于管道的进程间通信
功能说明:
本程序用于判断某目录下存放的若干个求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
基于管道的进程间通信
功能说明:
本程序用于判断某目录下存放的若干个求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查找,每个函数都会有对应的详细操作
最近忙着做各种东西没发表,发一篇水水