Linux API 列出正在运行的进程?
我需要一个 C/C++ API,它允许我列出 Linux 系统上正在运行的进程,并列出每个进程打开的文件。
我不想最终直接读取 /proc/ 文件系统。
任何人都可以想出一种方法来做到这一点吗?
I need a C/C++ API that allows me to list the running processes on a Linux system, and list the files each process has open.
I do not want to end up reading the /proc/ file system directly.
Can anyone think of a way to do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
http://procps.sourceforge.net/
http://procps.cvs.sourceforge.net/viewvc/procps/procps/proc/readproc.c?view =markup
是ps等处理工具的源码。 他们确实使用了 proc (表明这可能是传统且最好的方法)。 他们的来源非常可读。 该文件
可能有用。 另外一个有用的建议是由ephemient发布,链接到libproc提供的API,它应该在您的存储库中可用(或者我想说已经安装),但您需要标题和其他内容的“-dev”变体。
祝你好运
http://procps.sourceforge.net/
http://procps.cvs.sourceforge.net/viewvc/procps/procps/proc/readproc.c?view=markup
Is the source of ps and other process tools. They do indeed use proc (indicating it is probably the conventional and best way). Their source is quite readable. The file
May be useful. Also a useful suggestion as posted by ephemient is linking to the API provided by libproc, which should be available in your repo (or already installed I would say) but you will need the "-dev" variation for the headers and what-not.
Good Luck
如果您不想从 '/proc. 然后你可以考虑编写一个内核模块来实现你自己的系统调用。 并且您的系统调用应该这样编写,以便它可以获得当前进程的列表,例如:
上面的代码摘自我的文章 http://linuxgazette.net/133/saha.html。一旦您有了自己的系统调用,您就可以从用户空间程序中调用它。
If you do not want to read from '/proc. Then you can consider writing a Kernel module which will implement your own system call. And your system call should be written so that it can obtain the list of current processes, such as:
The code above is taken from my article here at http://linuxgazette.net/133/saha.html.Once you have your own system call, you can call it from your user space program.
给你(C/C++):
你可以在这里找到它:
http://ubuntuforums.org/showthread.php?t=657097
本质上,什么它的作用是循环遍历
/proc/
中的所有数字文件夹,然后在/proc//exe
上执行读取链接,或者如果您想要命令行参数cat /proc//cmdline
进程打开的文件描述符位于
/proc//fd/
/proc//fd/
/proc//fd/
/proc//fd/
Descriptor>
,然后通过对每个符号链接执行 readlink 来获取文件名,例如readlink /proc//fd/
。 fd 可以是一个设备,例如 /dev/null、一个套接字或一个文件,甚至可能更多。顺便说一句,这与
readproc.c
所做的(或至少是)相同。当然,希望他们做到了没有缓冲区溢出的可能性。
Here you go (C/C++):
You could have found it here:
http://ubuntuforums.org/showthread.php?t=657097
Essentially, what it does is loop through all numeric folders in
/proc/<pid>
, and then it does a readlink on/proc/<pid>/exe
, or if you want the command-line-argumentscat /proc/<pid>/cmdline
The file-descriptors open by the process are in
/proc/<pid>/fd/<descriptor>
, and you get the file name by doing a readlink on each symlink, e.g.readlink /proc/<pid>/fd/<descriptor>
. fd can be a device, such as /dev/null, a socket, or a file, and potentially more.This is, by the way, the same that
readproc.c
does (or at least did).Of course, hopefully they did it without buffer overflow possiblity.
如果你不这样做,那么我猜你将使用的任何 API 最终都会读取 /proc 文件系统。 以下是执行此操作的一些程序示例:
但不幸的是,这并不构成 API。
If you don't do it, then I guess whatever API you will use will end up reading the /proc filesystem. Here are some examples of program doing this:
But unfortunately, that does not constitute an API.
PS 和所有其他工具(内核模块除外)从
/proc
读取。/proc
是由内核动态创建的特殊文件系统,以便用户模式进程可以读取仅可用于内核的数据。因此,推荐的方法是从
/proc
读取。您可以快速直观地查看
/proc
文件系统以了解其结构。对于每个进程,都有一个
/proc/pid
,其中 pid 是进程 ID 号。 该文件夹内有多个文件,其中包含有关当前进程的不同数据。如果运行,
您将看到程序
ps
如何从/proc
读取此数据。PS and every other tool(EXCEPT for Kernel Modules) read from
/proc
./proc
is a special filesystem created on the fly by the kernel so that user mode processes can read data that will otherwise only be available for the kernel.The recommended way is therefore, reading from
/proc
.You can quickly intuitively look at the
/proc
filesystem to see how its structured.For every process there is a
/proc/pid
where pid is the process id number. Inside this folder there are several files which include different data about the current process.If you run
you will see how the program
ps
reads this data from/proc
.在不读取 /proc 的情况下执行此操作的唯一方法是调用“ps aux”,遍历每一行,读取第二列(PID)并用它调用 lsof -p [PID]。
...我建议阅读 /proc ;)
The only way to do this without reading /proc would be to call "ps aux", go through every line, read the second column (the PID) and call lsof -p [PID] with it.
...I'd suggest reading /proc ;)
procps-ng
项目 中有一个库libprocps
。 在 Ubuntu 13.04 上,如果您执行strace ps
,那么您可以看到ps
使用libprocps
。There's a library
libprocps
from theprocps-ng
project. On Ubuntu 13.04, if you dostrace ps
, then you can see thatps
useslibprocps
.读 proc 还不错。 我无法用 C++ 向您展示,但以下 D 代码应该为您指明正确的方向:
Reading proc is not too bad. I can't show you in C++, but the following D code should point you in the right direction:
通过名称查找任何进程的 pid 的简单方法
Easy way to fin pid of any process by name