这里的父子进程通信,其实说白了就是一个上课时候学的PV操作,是一个进程的同步,而终止进程,基本上就是关闭创建子进程的句柄,回收给子进程的资源,从而关闭这个进程。其中出现了以下的问题;
在没有修改之前:
wsprintf(szCmdLine, "\"%s\" chid" , szFilename) ;
//将szFilename 和 nCloneID 以规定的格式写入到szCmdLine中
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi; //这个结构体将存储CreateProcess返回的创建新的进程的一些信息以及他的主要线程
BOOL bCreateOK = ::CreateProcess(
szFilename,
szCmdLine,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi
);
在利用createprocess函数创建进程的时候,在命令行中就需要szCmdLine这个变量才作为argv中的的参数来创建这个子进程。由于两个参数是分开的,所以在wsprintf函数里面的"\"%s\" chid"这个部分,%s这里面要填入的是可执行文件的路径,而child是为了要创建子进程。所以两个参数之间要添加上空格才可以。
修改第一次之后:
wsprintf(szCmdLine, "\"%s\" chid" , szFilename) ;将此函数的child部分改为一个其他的字符串,那么在创建进程的时候,第二个参数就不再是child,很自然,在创建子进程的时候,进入的不再是child函数,而是parent函数,所以,程序就在不断的创建子进程,没有停止的趋势。创建进程函数的大致工作原理如下:
BOOL CreateProcess(
LPCWSTR pszImageName,
LPCWSTR pszCmdLine,
LPSECURITY_ATTRIBUTES psaProcess,
LPSECURITY_ATTRIBUTES psaThread,
BOOL fInheritHandles,
DWORD fdwCreate,
LPVOID pvEnvironment,
LPWSTR pszCurDir,
LPSTARTUPINFOW psiStartInfo,
LPPROCESS_INFORMATIO