【问题标题】:Is there a way to list all the current running processes in C [duplicate]有没有办法在 C 中列出所有当前正在运行的进程 [重复]
【发布时间】:2013-03-09 18:41:40
【问题描述】:

所以我正在构建自己的 shell,其中一个功能是列出所有后台运行的作业、它们的名称、PID、类似于 bash 的作业编号及其状态,即它是暂停还是运行。我还必须打印刚刚结束的后台作业的退出状态代码。现在我想知道是否有一个系统调用可以为我做这件事,或者一个 C api 调用,一旦它们在后台运行,或者我是否必须编写我自己的工作函数来完成我刚才提到的事情?谢谢。我正在使用 Linux 在 C 中执行此操作。

【问题讨论】:

  • 根本不使用系统。系统已经像一个 shell,我需要实现 'ps' 有没有办法获取所有需要的子 pid 等?
  • 您是指系统上的所有进程还是只是在 shell 中启动的进程?
  • @teppic 在 shell 中启动的那些。如果您在键入作业时使用 & 在后台放置 5 个命令,我想列出所有 5 个。
  • @RichardMckenna:我猜你必须获得 shell 的 pid 以及与 pstree util 相同的技术。
  • 好吧,既然ps 大概是用 C 语言编写的,那么肯定有一种方法可以做你正在尝试的事情......

标签: c linux


【解决方案1】:

一种快速简便的方法是搜索/proc,因为每个正在运行的进程在此处都有一个与其PID 相同的目录,以及名称和状态详细信息。您可以为此使用常规的 stdio 函数。

您可能想浏览psmisc 源代码,因为它包含一组标准的Linux 实用程序,旨在与/proc 交互。

【讨论】:

    【解决方案2】:

    对于您的具体任务(类似shell 的作业控制),您需要自己编写此类函数。顺便说一句,您已经拥有并且应该保留的大部分信息。

    • 应为 waitpid(2) 保留孩子的 PID。

    • 应保留用于启动子进程的命令行,因为进程可能会更改其 argv[0],因此原始行将丢失。

    • 作业编号是 shell 的纯粹内部事物,操作系统不会、不能也不会关心它(即,如果您不关心作业编号,那么没有人会为您关心它) .如您所见,只有您(即您的流程)拥有所需的信息。

    另一个原因是便携性。即使假设来自 Linux 上的 procfs (/proc) 的信息对你来说已经足够了,但在 FreeBSD 上,所有这些都是完全不同的事情——你需要通过 kvm(3) 接口工作。在 Mac OS X 上,您将需要第三种方式 - 没有 procfs,并且 kvm(3) 已经过时了。

    结论:您可能会绕过系统差异,但它只会为您提供部分信息。另一方面,无论如何,您必须或应该让这些信息在您的流程中浮动。只要使用它,它会更简单,更便携。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2020-10-07
      • 2019-05-04
      • 2016-09-20
      相关资源
      最近更新 更多