扫描Windows进程列表的最有效方法是什么?

3
我目前正在参与一个需要计时某些进程运行时间的项目。我试图找出最有效的方法来扫描进程列表,然后检查进程列表可执行文件名是否与支持的程序列表匹配。
问题可以分为两部分:
1)获取进程列表中进程可执行文件名的最有效方法
2)将此列表与另一个列表进行比较的最有效方法
对于(1),其他开发人员正在尝试使用tasklist命令并解析可执行文件名。我还发现C#有一个System.Diagnostic进程列表,可以自动完成此操作。我们仍在努力决定Java和C#之间的选择,所以我可能会倾向于使用语言中立的解决方案,但这可能是C#的决定性因素。
对于(2),支持的进程列表平均可能很小(1-10个进程名称)。我们可以只运行每个进程通过列表,但我们认为这可能对老年PC过于繁琐,所以我们考虑使用一个字母表平衡的AVL树,在应用程序启动时包含初始进程列表,并首先检查所有内容是否与该树匹配,如果不在树中,则检查我们支持的进程名称列表。
非常感谢任何建议。
编辑:显然,您可以按进程可执行文件名筛选tasklist,因此我们可以为支持的进程列表中的每个进程执行此操作。
编辑2:是否有适用于Windows XP Home的tasklist等效工具?
3个回答

4
如果你使用tasklist,实际上只需运行一次命令并获取所有结果可能会更快,而不是为每个可执行文件名称运行它。执行进程和获取输出都有一些开销。(当你获得结果后,你将需要在代码中循环遍历它们,但这可能会更快。通常不会有超过100个进程同时运行,所以这不会太糟糕。)你应该编写一个测试并检查是否正确。
在C#中,Process.GetProcesses() 是最好的方法。
在Java中,实际上没有等效的类/方法。获取进程列表非常依赖于操作系统,因此Java设计人员必须决定不将此功能集成/抽象到基本的Java类中。您可能需要在Windows上运行Runtime.getRuntime().exec("tasklist.exe") 或在Unix/Linux上运行exec("ps") 来获取结果。

2

希望我理解您的问题正确。您是否只是想将进程列表与正在运行的Windows活动进程进行比较?C#

static void Main(string[] args)
{
    // Approved processes.
    List<string> approvedProcesses = new List<string>();
    approvedProcesses.Add("chrome");
    approvedProcesses.Add("svchost");

    // LINQ query for processes that match your approved processes.
    var processes = from p in System.Diagnostics.Process.GetProcesses()
                    where approvedProcesses.Contains(p.ProcessName)
                    select p;

    // Output matching processes to console.
    foreach (var process in processes)
        Console.WriteLine(process.ProcessName + " " + process.Id.ToString());

    Console.ReadLine();

}

GetProcesses()使用与tasklist相同的机制来获取进程列表吗,也就是说它一样快吗?此外,是否有Java等效方法来执行此操作? - Tony Trozzo
对于这两个问题我都不确定。但是,如果您担心性能问题,那段代码经过了73个进程的运行,并在0.002秒内查询完成。 - Inisheer

1

你会经常进行这个检查吗?除非它基本上是连续的,否则我不会过早地担心优化(这是SO上的一个常见主题)。

一个系统通常只有少于100个进程在运行,即使有几千个进程,优化你的数据结构和设计最有效的算法真的不会节省太多时间。

话虽如此,我建议你获取所有正在运行的进程,并将该列表与内存中的批准列表进行比较。任何瓶颈可能都在于调用Windows询问进程的操作,因此只需执行一次而不是重复执行将是有益的。


这个检查可能每分钟执行一次。 - Tony Trozzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接