将程序状态导出到procfs?

时间:2011-11-19 08:51:11

标签: c reflection linux-kernel procfs

我可以在procfs中创建任何文件映射以反映我的程序的内部状态吗?

例如,

main.c:

char *message;

...

假设pid是1200,是否可以创建一个瞬态文件/ proc / 1200 / variables / message,它将反映消息变量?

我想我需要使用proc fs,因为有/ proc /.../{net,f​​d,task等等},如果我想在其中添加另一个变量/部分,我应该从哪里开始proc fs?

4 个答案:

答案 0 :(得分:4)

没有工具可以完成你想要完成的任务。

有些事情是关闭 - gdb(1)知道如何内省正在运行的程序并显示某些变量的值(并非所有变量都能在编译中存活 - 尽管调试{ {1}}标记帮助-g发现可能对您的程序进行的优化。)

FUSE项目使用户空间程序可以通过内核向其他进程提供文件系统。您可以直接使用FUSE从程序中导出选定的变量,也可以尝试使用FUSE的发布功能来封装gdb(1)内省能力,并为全世界提供此服务。

您还可以考虑在程序中使用9p - 它在精神上与FUSE类似,允许程序通过文件系统接口为其功能提供接口。 (您可以在wmii window manager中看到它正在使用中,通过文件系统接口可以对窗口管理器进行惊人的控制,允许使用您喜欢的任何语言轻松编程。)您可以再次将其与gdb(1)尝试提供此功能的内省能力。

我希望这样一个项目能够胜任高级项目或研究生院项目 - 而不是那些能够很快实现的项目。

答案 1 :(得分:3)

一般来说,你不能只从用户空间做到这一点。 procfs是向您报告其进程状态的内核。所以如果你想做这样的事情你就

a)必须创建一个内核模块,允许您将内容传回给它 b)通过某种信号触发内容检索。

所以,如果你真的想这样做。我建议如下路径:

1)编写一个可以传达程序状态的内核模块。我们将其称为kpsmod进行讨论。

2)让它与用户空间进行通信,让它通过某种机制(比如网络链接)与用户进程通信,以启动一些注册过程,注册变量地址。用户空间程序告诉模块它有兴趣将自己“输出”出信号(比如SIGHUP或SIGUSR1);使这个可编程。传递要读取的名称,地址和大小(如果需要,带有类型信息)。如果变量在堆栈上,则应该拒绝它。为此,只允许全局可访问的符号(为简单起见)

3)您甚至可以考虑在特定变量的proc_read时访问进程的ptrace堆栈。

4)然后内核模块应为每个变量和读取变量时创建/ proc / kpsmod // vars *

5)在读取时通过proc转储内存内容(可能是格式化的)

并且瞧瞧:-)你有你想要的效果。

答案 2 :(得分:3)

您可以使用命名管道而不是/proc

使用mkfifo创建一个fifo,让程序打开它进行写入。无论是在专用线程中还是异步,当有人在shell中运行cat your-pipe时,程序将生成文本。当然,cat会打开命名管道进行阅读。

这基本上模仿了cat /proc/....接口,但是没有内核模块实现文本生成,而是有一个实现它的程序。

答案 3 :(得分:1)

除非您正在编写内核模块,否则不能