Windows 8.1怎么监听父进程的退出
Windows 8.1如何监听父进程的退出?
系统环境:Windows 8.1
父进程是一个Windows Service,所以是Session 0隔离的。子进程是父进程CreateProcessAsUser创建的。
我的目的是想让子进程能够随着父进程的启动而启动,结束而结束。启动是很容易做到的,但现在检测结束的时候遇到了点问题。
如果父进程是正常退出的话,尚可以在析构函数中发一个命名事件的信号,但如果父进程Service是被强行关闭的话,是没有机会发信号的。
最初的想法是直接WaitSingleObject(hParentProcess),结果发现OpenProcess(hParentProcess,xxx)就失败了,没错,是Session0的问题。
还有一个方法就是在父进程开一个线程轮询给子进程发信号,直到发不出为止,但这样会比较笨。
想问一下有经验的朋友是怎么处理的?
------解决思路----------------------
服务内部创建一个共享Event(全局的),然后在子线程中不停地查询(OpenEvent),如果父进程退出,这个Event一定找不到。
那么可以退出了。
------解决思路----------------------
正规的方法还是Wait父进程的句柄。
因为权限原因打不开父进程的句柄可以用如下几个方案:
1、轮询法,子进程获得父进程的id号(传参即可),然后打开父进程句柄,如果打开成功,则等待之;如果打开失败且返回拒绝访问,说明父进程还在,开始轮询。直到OpenProcess失败,但不返回拒绝访问了,说明父进程没有了,子进程退出;
2、继承法,利用句柄继承来传递句柄值。这个你可以试试,我暂时不太确定。
3、句柄复制法,启动子进程后,父进程打开子进程,然后将自己的进程句柄复制到子进程内,并设法把句柄值告诉子进程
------解决思路----------------------
难道service中不可以用OpenProcess(bInheritHandle设为TRUE)打开自己然后作为命令行传入CreateProcessAsUser
然后child process中直接waitfor传入的handle吗?
或者service中用DuplicateHandle复制自己的processhandle给child process然后通过进程间通信将这个handle传给child process让它waitfor?
或者CreateProcessAsUser中加入SeDebugPrivilege权限然后child process就可以用OpenProcess打开parent process了?
系统环境:Windows 8.1
父进程是一个Windows Service,所以是Session 0隔离的。子进程是父进程CreateProcessAsUser创建的。
我的目的是想让子进程能够随着父进程的启动而启动,结束而结束。启动是很容易做到的,但现在检测结束的时候遇到了点问题。
如果父进程是正常退出的话,尚可以在析构函数中发一个命名事件的信号,但如果父进程Service是被强行关闭的话,是没有机会发信号的。
最初的想法是直接WaitSingleObject(hParentProcess),结果发现OpenProcess(hParentProcess,xxx)就失败了,没错,是Session0的问题。
还有一个方法就是在父进程开一个线程轮询给子进程发信号,直到发不出为止,但这样会比较笨。
想问一下有经验的朋友是怎么处理的?
------解决思路----------------------
服务内部创建一个共享Event(全局的),然后在子线程中不停地查询(OpenEvent),如果父进程退出,这个Event一定找不到。
那么可以退出了。
------解决思路----------------------
正规的方法还是Wait父进程的句柄。
因为权限原因打不开父进程的句柄可以用如下几个方案:
1、轮询法,子进程获得父进程的id号(传参即可),然后打开父进程句柄,如果打开成功,则等待之;如果打开失败且返回拒绝访问,说明父进程还在,开始轮询。直到OpenProcess失败,但不返回拒绝访问了,说明父进程没有了,子进程退出;
2、继承法,利用句柄继承来传递句柄值。这个你可以试试,我暂时不太确定。
3、句柄复制法,启动子进程后,父进程打开子进程,然后将自己的进程句柄复制到子进程内,并设法把句柄值告诉子进程
------解决思路----------------------
难道service中不可以用OpenProcess(bInheritHandle设为TRUE)打开自己然后作为命令行传入CreateProcessAsUser
然后child process中直接waitfor传入的handle吗?
或者service中用DuplicateHandle复制自己的processhandle给child process然后通过进程间通信将这个handle传给child process让它waitfor?
或者CreateProcessAsUser中加入SeDebugPrivilege权限然后child process就可以用OpenProcess打开parent process了?