所以我正在构建自己的 shell,其中一个功能是列出所有后台运行的作业,它们的名称、PID、类似于 bash 的作业编号及其状态,即它是暂停还是运行。我还必须打印刚刚结束的后台作业的退出状态代码。现在我想知道是否有一个系统调用可以为我做这件事,或者一个 C api 调用,一旦它们在后台运行,或者我是否必须编写我自己的工作函数来完成我刚才提到的事情?谢谢。我正在使用 Linux 在 C 中执行此操作。
2 回答
一种快速简便的方法是搜索/proc
,因为每个正在运行的进程在此处都有一个与其 PID 相同的目录,以及名称和状态详细信息。您可以为此使用常规的 stdio 函数。
您可能想浏览psmisc源代码,因为它包含一组标准 Linux 实用程序,旨在与/proc
.
对于您的具体任务(类似 shell 的作业控制),您需要自己编写此类函数。顺便说一句,您已经拥有并且应该保留的大部分信息。
应为 waitpid(2) 保留孩子的 PID。
应该保留用于启动子进程的命令行,因为进程可能会更改其 argv[0],因此原始行将丢失。
作业编号纯粹是外壳内部的东西,操作系统不会,不能也不会关心它(即,如果您不关心作业编号,那么没有人会为您关心它)。如您所见,只有您(即您的流程)拥有所需的信息。
另一个原因是便携性。即使假设来自 Linux 上的 procfs (/proc) 的信息对你来说已经足够了,但在 FreeBSD 上,所有这些都是完全不同的事情——你需要通过 kvm(3) 接口工作。在 Mac OS X 上,您将需要第三种方式——没有 procfs 并且 kvm(3) 前段时间已经过时。
结论:您可能会绕过系统差异,但它只会为您提供部分信息。另一方面,无论如何,您必须或应该让这些信息在您的流程中浮动。只需使用它,它将更简单,更便携。