用C#创建守护进程

usst13579 2008-01-02 05:55:33
假设我有个进程a.exe,希望有个守护进程b.exe在不断检测a.exe是否存在,如果不存在则启动它,通过执行c:\a.exe,请问这如何实现?
...全文
1875 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
tglflzqlmy 2010-03-12
  • 打赏
  • 举报
回复
帮你顶一个,呵呵```
hbbliyong 2010-03-12
  • 打赏
  • 举报
回复
不知道你搞定没?搞定了给说下啊!谢谢了……
only_lonely 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 usst13579 的回复:]

哎,我怎么就那么笨呢?对了,在这里进程和线程有什么联系?一个进程对应一个线程吗?
[/Quote]
进程是对计算机系统的抽象,提供了程序之间的分离,一个程序在进程中运行,它就可以假定是它独占了整个计算机
这就是进程的作用,使得不用修改程序的代码,就能不同的程序在同一台计算机上运行

在很久很久之前,其实是没有线程的,计算机要实现多任务,就要使用一个定时器触发中断,来回的在不同的进程中转换,后来人们发现,这样做实在是太耗费时间,于是就设计了一种附属于进程的执行流--线程
同一个进程的线程共享一个进程许多的资源,

同一个进程,可以拥有许多个线程
鸭梨山大帝 2010-03-12
  • 打赏
  • 举报
回复
有效率更高,效果更好的API,不用白不用,用了不白用.
以下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace ConsoleApplication
{
class Program
{

[DllImport("kernel32.dll")]
public static extern int WaitForSingleObject(int hHandle, uint dwMilliseconds);

const uint INFINITE = 0xFFFFFFFF;

static void Main(string[] args)
{
int ret = 0;
while (true)
{
if (Process.GetProcesses().FirstOrDefault(p => p.MainModule.ModuleName == "a.exe") != null)
{
Process p = Process.GetProcesses().FirstOrDefault(o => o.MainModule.ModuleName == "a.exe");
int hHandle = (int)p.Handle;
ret = WaitForSingleObject(hHandle, INFINITE);
if (ret == 0)
{
Process.Start(@"d:\a.exe");
}
}
else
{
Process.Start(@"d:\a.exe");
}
}
}
}

}



花小也盛开 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 usst13579 的回复:]

while(true)
{
Process[] P1 = Process.GetProcessesByName("xxx");
if(P1.Length == 0)
{
Process P2 = new Process();
P2.StartInfo.FileName = "D:\\xxx.exe";
P2.StartInfo.Arguments = "-s";
P2.Start……
[/Quote]
这样做是可以的。你如果要定时执行,也可以用Timer类,不是timer控件实现定时
鸭梨山大帝 2010-03-12
  • 打赏
  • 举报
回复
API: WaitForSingleObject
a68351153 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 usst13579 的回复:]
while(true)
{
Process[] P1 = Process.GetProcessesByName("xxx");
if(P1.Length == 0)
{
Process P2 = new Process();
P2.StartInfo.FileName = "D:\\xxx.exe";
P2.StartInfo.Arguments = "-s";
P2.Start(……
[/Quote]
效果已经达到了,但是就不清楚实际运行起来如何了? 是否回影响其他程序的运? lz去试试,再来告诉我们结果撒。 实践出真知啊。
flyerwing 2010-03-12
  • 打赏
  • 举报
回复
讯雷网吧版好象就是这个样子!
贫僧又回来了 2010-03-12
  • 打赏
  • 举报
回复
驴霸驴霸驴霸驴霸驴霸驴霸驴霸
guyehanxinlei 2010-03-12
  • 打赏
  • 举报
回复
写一个服务每隔一秒钟从进程管理器中查询一下是否有指定进程在运行,如果没有就启动它.

string[] names = ProcessNames.Split(new char[] { ',' });
foreach (string name in names)
{
Process[] process = System.Diagnostics.Process.GetProcessesByName(name, Environment.MachineName);
foreach (Process pro in process)
{
pro.Kill();
WriteActionLog("The process " + pro.ProcessName + " has been killed!");
}
process = null;
}
dgl_1225 2010-03-12
  • 打赏
  • 举报
回复
可以考虑用IPC进程通信,当A关闭的时候给B发个消息,让B知道就行了
cykevin 2009-12-24
  • 打赏
  • 举报
回复
可以先退出B嘛
abuzabi 2009-12-24
  • 打赏
  • 举报
回复
我的疑问:如果A.EXE被B.EXE监视,那A.EXE运行完应该退出的时候,B.EXE检测怎么停止?正常停止A.EXE后也会被启动起来啊!
ttayaa 2008-09-03
  • 打赏
  • 举报
回复
用个TIMER来做嘛
pittle 2008-05-06
  • 打赏
  • 举报
回复
这样并不好 最好还是用进程关闭事件来触发检查,while true 会很慢
KKND2006 2008-01-03
  • 打赏
  • 举报
回复
你自己开启的进程里面的线程,你自己还不知道...

Thread.Sleep是停掉指定的线程
usst13579 2008-01-03
  • 打赏
  • 举报
回复
我的意思是我开启的进程会不会有多个线程?如果有多个线程,那Thread.Sleep是所有的线程都停止吗?
haiwangstar 2008-01-03
  • 打赏
  • 举报
回复
进程和线程有什么联系

进程基本是资源分配单位,线程才是真正的执行单元,

一个进程对应一个线程吗


一个进程可以有多个线程,至少要有一个线程。线程也不能离开进程单独存在。
usst13579 2008-01-03
  • 打赏
  • 举报
回复
while(true)
{
Process[] P1 = Process.GetProcessesByName("xxx");
if(P1.Length == 0)
{
Process P2 = new Process();
P2.StartInfo.FileName = "D:\\xxx.exe";
P2.StartInfo.Arguments = "-s";
P2.Start();
}
Thread.Sleep(1000);
}
这样不知道行不行?由于是我公司的服务器上的进程需要守护,因此我怕这样会有什么不良后果,请高手指教!
zfh198601 2008-01-03
  • 打赏
  • 举报
回复
都是强人啊
加载更多回复(9)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧