有没有一种方法可以在C中列出所有当前正在运行的进程

有没有一种方法可以在C中列出所有当前正在运行的进程,c,linux,C,Linux,因此,我正在构建自己的shell,其中一个功能是列出所有后台运行的作业,它们的名称、PID、作业编号类似于bash,以及它的状态,即它是挂起的还是正在运行的。我还必须打印刚刚结束的后台工作的退出状态代码。现在我想知道,一旦它们在后台运行,是否有一个系统调用可以为我做到这一点,或者是一个C api调用,还是我必须编写自己的作业函数来完成我刚才提到的任务?谢谢我使用Linux在C中执行此操作。一种快速简便的方法是搜索/proc,因为每个正在运行的进程在这里都有一个与其PID相同的目录,以及名称和状态

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

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


您可能希望浏览源代码,因为它包含一组标准的Linux实用程序,设计用于与
/proc

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

您可能希望浏览源代码,因为它包含一组标准的Linux实用程序,设计用于与具体任务(类shell作业控件)的
/proc
接口,您需要自行编写此类函数。顺便说一句,你已经拥有的大部分信息都应该保留下来

  • 孩子的PID应该保留等待PID(2)

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

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

另一个原因是可移植性。即使假设Linux上procfs(/proc)的信息对您来说已经足够了,但在FreeBSD上,所有这些都是完全不同的事情——您将需要通过kvm(3)接口工作。在MacOSX上,您将需要第三种方式——没有procfs,kvm(3)在一段时间前已经过时了

结论:你可以围绕系统差异跳舞,但它只会给你一部分信息。从另一方面来说,您无论如何都有或应该有这些信息在您的流程中浮动。只要使用它,它就会简单得多,可移植得多。

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

  • 孩子的PID应该保留等待PID(2)

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

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

另一个原因是可移植性。即使假设Linux上procfs(/proc)的信息对您来说已经足够了,但在FreeBSD上,所有这些都是完全不同的事情——您将需要通过kvm(3)接口工作。在MacOSX上,您将需要第三种方式——没有procfs,kvm(3)在一段时间前已经过时了


结论:你可以围绕系统差异跳舞,但它只会给你一部分信息。从另一方面来说,您无论如何都有或应该有这些信息在您的流程中浮动。只要使用它,它就会简单得多,便携得多。

根本不用系统。系统已经像一个shell了,我需要实现“ps”是否有办法获得所有需要的子PID等?你是指系统上的所有进程还是仅在shell中启动的进程?@teppic在shell中启动的进程。如果你在后台使用&输入作业时,我想列出所有5条命令。@RichardMckenna:我想你必须获得shell的pid和与pstree util相同的技术。好吧,既然
ps
大概是用C编写的,那么肯定有一种方法可以完成你正在尝试的任务……根本不用系统。系统已经像一个shell了,我需要实现“ps”是否有办法获得所有需要的子PID等?你是指系统上的所有进程还是仅在shell中启动的进程?@teppic在shell中启动的进程。如果你在后台使用&输入作业时,我想列出所有5条命令。@RichardMckenna:我想你必须得到shell的pid和与pstree util相同的技术。好吧,既然
ps
大概是用C编写的,那么肯定有一种方法可以完成你正在尝试的任务。。。