利用三线程实现进程守护,出现的几个问题。

时间:2021-04-15 14:55:39
关于“三线程”我就不多说了。其实就是“三线程诱鼠器”。在很多文章中都有介绍。。例如http://www.vckbase.com/document/viewdoc/?id=754
三线程的分析图如下:

  |---------->-----------|   
remote ---<--- T-mouse --->--- watch --->--- Registry
  |------------------<--------------------|

 其中T-mouse为主进程/主线程,remote为创建的远程线程,watch为本地的辅助监视线程,Registry为注册表文件。T-mouse创建remote和watch两个线程,remote监视T-mouse主进程,watch监视注册表文件和remote线程。   
我的问题是:为什么T-mouse主线程被K掉后,remote也实现了进程的创建功能,但是为什么我放在主线程中的代码不会被再次执行。还有就是watch也不会再次执行了。。。如果有哪位高手熟悉这方面的话请赐教,分不够可以再加。希望高手们不要给篇文章就了事了。这方面的文章大都看过了,希望高手们给了思路或者这方面的有可行性的代码!!!

10 个解决方案

#1


主线程都没了,子线程当然不会执行……在主线程中使用Sleep等函数,连所有的子线程都会全部停止,不知道楼主的意思

#2


那篇文章只是大概介绍了原理,细节部分是需要自己完善的。
线程是对等的,没有主从之分。只有一个线程是由哪个线程创建的区别。但我们通常把进程启动时的第一个线程成为主线程,因为在这个线程里要接收鼠标键盘消息

WinExec不是创建线程,是创建进程,而这个进程不是在你的debug控制里,所以主线程的代码不会再次执行,你可以用主线程在注册表中创建一个临时项,然后对该项的值进行累加,就可以看到结果了。
watch你要写成
while(1)
{
....
sleep(100);
}类似于这个样子的死循环。
http://blog.csdn.net/night_cat/archive/2009/05/29/4223462.aspx 这里有一个例子。

#3


我想我还是帮顶吧

#4


引用 3 楼 wanghao111 的回复:
我想我还是帮顶吧



同感。

#5


谢谢二楼给的帮助,但是有一点我还不是很明白,如果我的主进程被K掉后由它所创建的线程难道不给K掉吗?例如这里的watch线程。。即使你用while(1)了,进程被K后也是没有用的啊。。
我的原意是我的程序想使用三线程进行进程的守护(主要参考三线程的思想)但是最主要的问题就是:进程被K后虽然使用WinExec进行了恢复。但是我想实现的功能代码却不被再次执行。。这使我的功能代码应该放在什么地方呢?????
希望高手们给予指教!!!!!!不胜感激!!!!!!

#6


刚才又看了一下二楼的回复,觉得“WinExec不是创建线程,是创建进程,而这个进程不是在你的debug控制里,所以主线程的代码不会再次执行”这句话给我点思路,然后又去搜了些winexec和createprocess的异同。不知道如果这里使用createprocess能不能让我的进程在我的debug控制中(就是说能否让我的主程序再次执行呢。。)
希望高手们给予指教!!!!!不胜感激!!!!

#7


进程被杀掉,那么所有的附属线程也会被终止。一个线程被杀掉,则与其同属于一个进程的线程不受影响。

不知掉如何用命令行启动vs工程的调试。可以改用windbg。即WinExec 是调用windbg来启动你的程序。
Windbg “path to executable” arguments
http://blog.csdn.net/CharlesPrince/archive/2008/07/29/2727801.aspx

最简单的办法还是在你的main中追加注册表,或在某个文件(比如c:\test.txt)中追加内容。

#8


学习学习,帮顶了,楼主~

#9


主线程k掉,附属线程肯定也k掉了。
remote是远程线程,在另一个进程的地址空间,不知道是不是这样。
你要想实现这样的功能,可以把watch也设计成远程线程。

#10


引用 3 楼 wanghao111 的回复:
我想我还是帮顶吧

mark

#1


主线程都没了,子线程当然不会执行……在主线程中使用Sleep等函数,连所有的子线程都会全部停止,不知道楼主的意思

#2


那篇文章只是大概介绍了原理,细节部分是需要自己完善的。
线程是对等的,没有主从之分。只有一个线程是由哪个线程创建的区别。但我们通常把进程启动时的第一个线程成为主线程,因为在这个线程里要接收鼠标键盘消息

WinExec不是创建线程,是创建进程,而这个进程不是在你的debug控制里,所以主线程的代码不会再次执行,你可以用主线程在注册表中创建一个临时项,然后对该项的值进行累加,就可以看到结果了。
watch你要写成
while(1)
{
....
sleep(100);
}类似于这个样子的死循环。
http://blog.csdn.net/night_cat/archive/2009/05/29/4223462.aspx 这里有一个例子。

#3


我想我还是帮顶吧

#4


引用 3 楼 wanghao111 的回复:
我想我还是帮顶吧



同感。

#5


谢谢二楼给的帮助,但是有一点我还不是很明白,如果我的主进程被K掉后由它所创建的线程难道不给K掉吗?例如这里的watch线程。。即使你用while(1)了,进程被K后也是没有用的啊。。
我的原意是我的程序想使用三线程进行进程的守护(主要参考三线程的思想)但是最主要的问题就是:进程被K后虽然使用WinExec进行了恢复。但是我想实现的功能代码却不被再次执行。。这使我的功能代码应该放在什么地方呢?????
希望高手们给予指教!!!!!!不胜感激!!!!!!

#6


刚才又看了一下二楼的回复,觉得“WinExec不是创建线程,是创建进程,而这个进程不是在你的debug控制里,所以主线程的代码不会再次执行”这句话给我点思路,然后又去搜了些winexec和createprocess的异同。不知道如果这里使用createprocess能不能让我的进程在我的debug控制中(就是说能否让我的主程序再次执行呢。。)
希望高手们给予指教!!!!!不胜感激!!!!

#7


进程被杀掉,那么所有的附属线程也会被终止。一个线程被杀掉,则与其同属于一个进程的线程不受影响。

不知掉如何用命令行启动vs工程的调试。可以改用windbg。即WinExec 是调用windbg来启动你的程序。
Windbg “path to executable” arguments
http://blog.csdn.net/CharlesPrince/archive/2008/07/29/2727801.aspx

最简单的办法还是在你的main中追加注册表,或在某个文件(比如c:\test.txt)中追加内容。

#8


学习学习,帮顶了,楼主~

#9


主线程k掉,附属线程肯定也k掉了。
remote是远程线程,在另一个进程的地址空间,不知道是不是这样。
你要想实现这样的功能,可以把watch也设计成远程线程。

#10


引用 3 楼 wanghao111 的回复:
我想我还是帮顶吧

mark