我有一个我开始的过程,它将使用以下方式重复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#
答案 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和定义结构,但它可能是完成。