问题标签 [procfs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何从 C++ 获取可执行的共享库列表?
我想以编程方式获取我的二进制文件在 Linux 和 Solaris 上链接的共享库列表。现在我使用 pmap (我不能ldd
在二进制文件上使用,因为它不包含 dlopen'd 库,我不能使用pldd
,因为它只是 Solaris):
这有点骇人听闻,但它适用于 Solaris 和 Linux(pmap 输出略有不同,但所需的信息总是在最后一列)。有没有办法在不掏空的情况下获得相同的信息?这在两个平台上都有效吗?我假设/proc/$PID
文件之间的格式不同,但我不知道帮助解析这些文件的标题通常位于哪里(如果有一个共同的位置?)。
linux - /proc/cpuinfo 地址大小信息如何与内存页面大小相关?
标记为 -lm 的 cpu 上的 cat /proc/cpuinfo 给出
确定的页面大小
给出 4096 字节。
使用后面的信息,我会认为系统使用地址的最低有效 12 位作为偏移量,其余的用于通过 TLB 和页表从虚拟到物理的地址转换。
cpuinfo 中的信息与页面大小有何关系?
c - 将程序状态导出到 procfs?
我可以在 procfs 中创建任何文件映射来反映程序的内部状态吗?
例如,
假设 pid 为 1200,是否可以创建一个临时文件 /proc/1200/variables/message,它将反映消息变量?
我想我需要使用 proc fs,因为有 /proc/.../{net, fd, task, etc.},如果我想在 proc fs 中添加另一个变量/部分,我应该从哪里开始?
linux - 如何从 proc 文件中读取大数据?
我正在尝试编写一个内核模块,它将一些数据写入 proc 文件。我正在尝试编写类似 5000 个字符的内容,但是当我说 $>cat /proc/myentry 时,我只能读取 1000 个字符。
这是我的代码。提前致谢。
linux - Linux中进程的空闲时间
我需要计算 Linux 中一个进程的 CPU 使用率(用户模式、系统模式、空闲时间)。我可以使用utime
和stime
中的值来计算用户和系统模式下的使用情况/proc/PID/stat
,但我没有发现任何与空闲时间相关的内容。
我知道我可以从中获得空闲时间,/proc/stat
但这个值与机器有关,与特定进程无关。
是否可以计算知道进程的空闲时间PID
(从目录中读取数据/proc
)?
c - 如何解析通过 /proc 文件传递给内核模块的大量数据?
编辑:我发现seq_file
这可以轻松将大量数据从内核写入用户空间。我正在寻找的是相反的;一种有助于从用户空间读取大量数据(超过一页)的 API。
编辑 2:我正在实现一个<stdio.h>
内核模块的端口,它能够打开/proc
(以及后来的其他虚拟文件系统)类似于FILE
s 并处理类似于<stdio.h>
. 您可以在此处找到该项目。
我发现了很多关于内核如何将大量数据写入 /proc(供用户空间程序使用)的问题,但反之则没有。让我详细说明:
这个问题基本上是关于输入被标记化的算法(例如到int
s 或int
和字符串的混合等),因为数据可能在多个缓冲区之间被破坏。
例如,假设以下数据被发送到内核模块:
为了这个例子,假设 Linux 提供 /proc 处理程序的页面大小是 20 字节(相对于实际的 4KB)。
从 /proc (在内核模块中)读取数据的函数会看到这样的数据:
如您所见,78
在第一次调用中读取时,它不应该在下一帧之前被处理,以便它决定78
是整数还是帧之间的剪切。
现在我发现seq_file
s 显然只适用于内核想要向用户写入数据而不是读取数据(或者可能是 HOWTO 写得很糟糕)。
我做了什么
到目前为止,我提供了以下解决方案(我是凭记忆写的,所以我可能会错过一些错误检查,但请耐心等待):
在初始化阶段(比如说init_module
):
/proc 阅读器:
稍后我会解释为什么我要去掉空格
get_int
功能:
data_processor
功能(例如):
解释:首先,见data_processor
。它不会涉及如何读取数据的复杂性,因此它只是获取整数并对其进行任何操作。现在让我们看看 /proc 阅读器。它基本上等待data_processor
调用get_int
足够的时间以消耗所有当前数据(步骤 1),然后将下一个缓冲区复制到内部存储器中,允许data_processor
继续(步骤 2)。然后它需要去除尾随空格,因此get_int
可以稍微简化一下(步骤 3)。最后,它发出get_int
可以开始读取数据的信号(步骤 4)。
该get_int
函数首先等待数据到达(步骤 1),(暂时忽略步骤 2)它会跳过任何不需要的字符(步骤 3),然后开始读取数字(步骤 4)。读取数字的结束有两种可能;到达缓冲区的末尾(在这种情况下,如果 /proc 读取器没有删除任何空格,那么该数字可以在帧之间剪切)或遇到空白。在前一种情况下,它需要向 /proc reader 发出信号以读取更多数据并等待另一个循环将剩余的数字附加到当前的数字上,在后一种情况下,它返回数字(步骤 5)。如果从最后一帧继续,请检查新帧是否以数字开头。如果不是,那么之前的数字实际上是一个整数,应该返回。否则,它需要继续将数字附加到最后一个数字(步骤 2)。
问题
这种方法的主要问题是过于复杂。添加时会变得更加复杂get_string
,或者读取的整数可能是十六进制等。基本上,您必须重新发明sscanf
!请注意,sscanf
在这个简单的示例中,可以在步骤 4 中使用,get_int
而不是while
循环(或者也可以使用get_string
,但是当十六进制输入也是可能的(想象十六进制数在 0 和 x0212ae4 之间切割)时会变得更加棘手。即便如此,它只是替换了第 4 步get_int
,其余的东西应该仍然存在。
实际上,它给我带来了许多错误和繁重的测试,以完善所有特殊情况。这也是它在我看来并不优雅的另一个原因。
问题
我想知道是否有更好的方法来处理这个问题。我知道使用共享内存可能是一种选择,但我正在为这项任务寻找一种算法(更多的是出于好奇,因为我已经有了我的工作解决方案)。进一步来说:
- Linux 内核中是否有一种已经实现的方法可以像普通 C 语言一样处理
FILE
,您可以从中获取数据并自行处理将数据分解为页面的过程? - 如果不是,我是否让事情过于复杂,我是否错过了一个明显简单的解决方案?
- 我相信
fscanf
面临类似的问题。这是如何处理的?
附带问题:我在互斥体上阻止 /proc 读取器是一件可怕的事情吗?我的意思是,写入数据可能会阻塞,但我不确定这是否通常发生在用户空间或内核空间中。
c - procfs 需要 copy_to_user 吗?
copy_to_user
当内核通过 procfs 写入用户时,我一直认为这是必要的。
不过我忘了做一次(我用过snprintf
),一切正常。现在我注意到了,我一直在寻找。我发现这个链接并没有说copy_to_user
是需要的,即使对于其他部分(从用户读取的内核)它确实说copy_from_user
是必要的。
那么,提供给内核模块的缓冲区是否已经在内核空间中写入数据(以便用户从中读取)?copy_to_user
通过procfs写的时候真的不需要吗?还是我很幸运没有撞车?
c - 关于大小的 copy_from_user 警告不能被证明是正确的?
我在编译我的内核模块时遇到了一个我无法解决的警告。
首先看一下这个简化的代码:
我得到的警告如下:
警告:调用带有属性警告的“copy_from_user_overflow”声明:copy_from_user() 缓冲区大小无法证明是正确的
如您所见,这是完全错误的。amount
我读到的数据证明是好的!我发现这个链接说min
可以在最后一个参数中使用以使 gcc 静音,但它对我不起作用(我写道:
无济于事)。
有谁知道如何让 gcc 知道这很酷而且不用担心?
发生这种情况的另一个地方如下所示:
在这种情况下,gcc 也会给我同样的警告,即使它肯定是正确的。
这是确切的错误:
内核版本:2.6.35.9 用 rtai 打补丁(如您所见)
c++ - 我是不是太快了以至于数不清?
我在不同的数据库系统上做了一些本地实验。/proc/status
我在执行查询之前和之后收集(总结)CPU 信息。差异应该告诉我查询运行期间的 jiffies 或 USER_HZ 的数量。clock_gettime()
但是当(根据)查询的运行时间低于时,差异为零0.001 seconds
。这是为了快速利用 CPU 信息还是我错过了其他东西?
linux - VmRSS 和驻留集大小如何匹配?
我解析数据/proc/[pid]/statm
以获取有关某个进程的内存使用情况的线索。man proc
指出驻留集大小(以“页面”衡量)与/proc/[pid]/status
. 由于它们具有不同的价值观,我想了解这些价值观之间的联系。有没有我可以在某处读到的因素/proc
(我想到了 VmPTE,但它的……其他……)?我应该解析两者中的哪一个来获取某个进程的已用内存的大小?