5

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

例如,

main.c:

char *message;

...

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

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

4

4 回答 4

4

没有工具可以做你想做的事。

有些事情很接近——gdb(1)知道如何内省正在运行的程序并显示一些变量的值(并非所有变量都能在编译后存活——尽管调试-g标志有助于gdb(1)发现可能对你的程序进行了哪些优化)。

FUSE项目使用户空间程序可以通过内核向其他进程提供文件系统。您可以直接使用 FUSE 从您的程序中导出选定的变量,或者您可以尝试一些更加雄心勃勃的东西并编写工具来封装gdb(1)FUSE 的发布能力的内省能力,并为全世界提供这项服务。

你也可以考虑9p在你的程序中使用——它在本质上类似于 FUSE,允许程序通过文件系统接口为其功能提供接口。wmii(您可以在窗口管理器中看到它的使用情况,其中可以通过文件系统接口对窗口管理器进行惊人的控制,从而可以使用您喜欢的任何语言轻松编程。)您可以再次将其与gdb(1)'s introspection集成尝试提供此功能的能力。

我希望这样的项目值得一个高级项目或研究生项目——不是很快就能完成的事情。

于 2011-11-19T09:02:46.337 回答
3

一般来说,您不能仅从用户空间执行此操作。procfs 是向您报告其进程状态的内核。所以如果你想做这样的事情,你会

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

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

1) 编写一个可以通信程序状态的内核模块。让我们将其称为 kpsmod 以供我们讨论。

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

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

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

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

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

于 2011-11-19T09:05:14.103 回答
3

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

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

这基本上模仿了cat /proc/....界面,但不是让内核模块实现文本生成,而是有一个程序来实现它。

于 2011-11-19T10:54:17.110 回答
1

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

于 2011-11-19T08:58:56.800 回答