我可以在procfs中创建任何文件映射以反映我的程序的内部状态吗?
例如,
main.c:
char *message;
...
假设pid是1200,是否可以创建一个瞬态文件/ proc / 1200 / variables / message,它将反映消息变量?
我想我需要使用proc fs,因为有/ proc /.../{net,fd,task等等},如果我想在其中添加另一个变量/部分,我应该从哪里开始proc fs?
答案 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)
除非您正在编写内核模块,否则不能