命名一个进程,以便我可以在以后杀死它

时间:2015-02-18 10:30:44

标签: c# process

我有一个我开始的过程,它将使用以下方式重复ping主机:

ping my_ip /t

我使用此代码启动它

Process process = new Process();
process.StartInfo = new ProcessStartInfo(@"C:\windows\system32\cmd.exe");
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.Arguments = "/c ping " + my_ip  + " /t";
process.Start();

现在,如果我的应用程序意外终止,我想关闭这个' PING'重新启动应用程序。

我可以通过这些流程进行枚举,直到我看到名称“ping'杀了它。

但作为一个悲观的程序员,可能会有另一个应用程序启动另一个Ping进程,所以我不想杀死这个进程。

有没有办法设置进程的id,以便我可以专门杀死该进程?

我正在使用C#

1 个答案:

答案 0 :(得分:2)

你不必为此命名。您已将其存储在process变量中。只需将其存储在某个地方,然后致电:

process.Kill();

每当您退出申请时

PS:请注意,您使用process.WaitForExit();这将阻止您的申请,直到辅助流程结束。不知道为什么你有它。

更新

根据评论,您说如果您的应用程序意外终止,您可能想要终止该过程。

两件事:

1)如果您的申请以非确定性的方式终止(致命的崩溃或类似的事情),那么您的应用程序关闭时无法做任何事情,因此您无法做到这一点。即使它有名字,也要终止该过程。

2)您的Process变量有一个Id字段。您可以将其存储在磁盘或其他东西上,并尝试在应用程序重新启动时将其终止。但是警告:进程ID不是独占的......如果您的衍生ping已经终止(通过任何方式),则其他进程可能具有相同的ID。如果你正在控制这个过程,你只能确定这是你原来的衍生过程。终止。

作为一种可能的解决方案,您可以创建一个"工作对象" (documentation)使用JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE作为其限制(doc),并使用AssignProcessToJobObject将子进程分配给它,这将使子进程被Windows杀死你的过程终止了。

我认为没有Job Objects的.NET包装器(我不知道一个),所以它应该采取一些P / Invoking和定义结构,但它可能是完成。