父进程等待子进程执行某动作的模型码
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);
这样子进程执行之后,系统马上即可以释放内核对象,避免资源浪费
(假设并无其他进程对于子进程进程访问)
这称之为子进程的分离模式
*/
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);
这样子进程执行之后,系统马上即可以释放内核对象,避免资源浪费
(假设并无其他进程对于子进程进程访问)
这称之为子进程的分离模式
*/
相关文章推荐
- Windows批处理 调用程序后 不等待子进程 父进程继续执行命令
- Windows批处理 调用程序后 不等待子进程 父进程继续执行命令
- 验证子进程退出时会给父进程发送信号的机制 、 编写父进程等待子进程的异步版本
- 父进程非阻塞回收子进程(适用LINUX下C语言的client-server模型)
- 操作系统实验参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进 程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制 ps 命令总在 ls 命令之前执行。
- 父进程异步等待子进程
- 进程等待及子进程异步等待方式
- c# 使用Process调用外部程序时等待该进程结束后再执行住进程
- [Linux进程]使用vfork创建子进程并且执行命令
- linux下的wait()实现等待一个子进程和所有子进程退出
- 子进程等待父进程退出及fork使用
- shell命令管道未读完阻塞了子进程,与等待其结束的父进程死"锁"。
- Linux退出进程exit/_exit和等待子进程退出wait函数分析
- vb6创建子进程并等待子进程的退出。
- 进程fork()两次---解决一个进程不必等待子进程终止,也不希望子进程处于僵死状态(一般是服务器进程fork())
- 父子进程PIPE通讯控制子进程输入执行自动化命令
- 如何知道客户端上的某个进程所引发的SQL上的正在执行的动作?
- windows 批处理(bat)中执行程序后不等待直接退出(cmd中新进程执行程序)
- shell之使用eval模拟一维数组保存进程pids,并调用wait等待所有进程执行完返回
- exit--进程退出;wait--进程等待;execl--执行程序