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

#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);
    这样子进程执行之后,系统马上即可以释放内核对象,避免资源浪费
    (假设并无其他进程对于子进程进程访问)
    这称之为子进程的分离模式
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值