gpt4 book ai didi

c# - System.Diaganostics.Process.Id 与任务管理器中显示的进程 ID 不同。为什么?

转载 作者:太空狗 更新时间:2023-10-29 20:02:12 25 4
gpt4 key购买 nike

我正在使用 C# 的 System.Diagnostic.Process 对象。
它的属性之一是 Id
此生成的 IdWindows 任务管理器 中显示的 PID 不同。
这是为什么?

你看,一旦这个过程开始。
它启动了另外两个非托管进程,我无法通过对象属性引用显式获取它们的 ID。
我必须通过 System.Diagnostics.Process.GetProcesses() 搜索所有进程以按进程名称找到它们。

我正在尝试找到一种可靠的方法来通过 PID(显示在 任务管理器 中的那个)终止此进程和所有相关进程。
有没有更好的方法?

我不能只终止具有关联进程名称的所有进程,因为这可能会终止那些与我的程序无关的进程的其他实例。

最佳答案

关键是你不想通过 Id 杀死你的进程。事实上,这是一个竞争条件:您派生的进程可能会终止,并且可能会创建另一个具有相同 ID 的进程。然后当你去杀死它时,你最终会杀死新进程而不是已经死掉的旧进程。

杀死派生进程的最可靠方法是将它们放入 Job 对象中,并在任务完成后终止 Job。

下面是一些实现 Job 类的简单代码:

class Job
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr CreateJobObject(IntPtr lpJobAttributes, string lpName);

[DllImport("kernel32.dll")]
public static extern bool AssignProcessToJobObject(IntPtr hJob, IntPtr hProcess);

[DllImport("kernel32.dll")]
public static extern bool TerminateJobObject(IntPtr hJob, uint uExitCode);

IntPtr job;

public Process StartProc(string commandLine)
{
if (job == IntPtr.Zero)
job = CreateJobObject(IntPtr.Zero, null);
ProcessStartInfo si = new ProcessStartInfo(@"c:\windows\system32\cmd.exe");
si.Arguments = "/c " + commandLine;
si.CreateNoWindow = false;
si.UseShellExecute = false;
Process proc = Process.Start(si);
AssignProcessToJobObject(job, proc.Handle);
return proc;
}

public void TerminateProc()
{
// terminate the Job object, which kills all processes within it
if (job != null)
TerminateJobObject(job, 0);
job = IntPtr.Zero;
}
}

关于c# - System.Diaganostics.Process.Id 与任务管理器中显示的进程 ID 不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2316596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com