您的位置:首页 > 其它

父进程等待子进程执行某动作的模型码

2007-04-13 14:26 232 查看
#include "windows.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
PROCESS_INFORMATION pi;

//创建子进程
BOOL bIsOk = CreateProcess(..., &pi);
if (bIsOk)
{
//这时子进程开的始执行了,跑子进程代码,执行所需动作
//...
//父进程执行这里的代码,由于父进程拿到了子进程及其主线程的句柄
//所以关闭,通知系统os,减少其使用计数,因为子进程独立的去执行动作,
//父进程无需操纵子进程的线程,所以及时关句柄,以便子进程结束时
//可以马上释内核对象,避免资源浪费的情形
CloseHandle(pi.hThread);

//父进程等待子进程的结束,由于父进程这里需判断子进程结束与否,所以上述的过程未马上
//关闭子进程句柄,不像子进程主线程句柄,由于并不影响子进程代码的执行,
//所以早释放好,当然如果需操作影响子进程的主线程执行,上述并不马上关子进程主线程的句柄

//WaitForSingleObject函数的作用,是等待句柄指的内核对象置为有信号状态,而进程内核对象在进程结束的时候
//置为有信号状态,所以达到目的,等子进程执行
WaitForSingleObject(pi.hProcess, INFINITE);

//子进程此时已执行成功了,父进程可以获得其结束码
DWORD dwExitCode;
GetExitCodeProcess(pi.hProcess, &dwExitCode);

//父进程无需操纵子进程的时候,可以closehandle了,但是子进程内核对象的释放
//需看使用计数,其他是否仍在使用子进程,由系统释放内核对象
CloseHandle(pi.hProcess);
}
}

/*
1. 一般让另一块的代码执行某个动作
创建线程,但是线程共享继承内存地址空间,可能破坏数据
为了保护原进程的内存地址空间的话,可以创建子进程以执行,这样独立内存地址空间

2. 如父进程它并不操纵子进程的执行的话,完全可以创建的成功之后,马上
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
这样子进程执行之后,系统马上即可以释放内核对象,避免资源浪费
(假设并无其他进程对于子进程进程访问)
这称之为子进程的分离模式
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐