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