首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否将程序状态导出到procfs?

是否将程序状态导出到procfs?
EN

Stack Overflow用户
提问于 2011-11-19 16:51:11
回答 4查看 1.4K关注 0票数 5

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

例如,

代码语言:javascript
复制
main.c:

char *message;

...

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

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

EN

回答 4

Stack Overflow用户

发布于 2011-11-19 17:02:46

没有工具可以完成你想要完成的事情。

有些事情是相近的-- gdb(1)知道如何内省正在运行的程序并显示某些变量的值(并非所有变量都能通过编译--尽管debug -g标志可以帮助gdb(1)发现优化可能对您的程序造成了什么影响)。

FUSE项目使用户空间程序能够通过内核向其他进程提供文件系统。您可以直接使用FUSE从程序中导出选定的变量,也可以尝试一些更有野心的东西,编写工具将gdb(1)的自省功能与FUSE的发布功能封装在一起,并为世界提供此服务。

您还可以考虑在程序中使用9p --它在本质上类似于FUSE,允许程序通过文件系统接口为其功能提供接口。(您可以在wmii window manager中看到它的使用,其中可以通过文件系统接口对窗口管理器进行大量的控制,从而允许使用您喜欢的任何语言进行简单的编程。)同样,您可以将此功能与gdb(1)的自省功能相结合,以尝试提供此功能。

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

票数 4
EN

Stack Overflow用户

发布于 2011-11-19 17:05:14

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

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

所以,如果你真的想这么做。我建议走以下道路:

1)编写一个能传递程序状态的内核模块。为了便于我们的讨论,让我们称其为kpsmod。

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

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

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

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

瞧:-)你得到了你想要的效果。

票数 3
EN

Stack Overflow用户

发布于 2011-11-19 18:54:17

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8192937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档