- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解析来自 /proc/<pid>/smaps
的 PSS 值我的 C++ 二进制文件中的一个进程。
根据 this SO answer ,天真地读了/proc/<pid>/smaps
文件例如 ifstream::getLine()
将导致数据集不一致。建议的解决方案是使用 read()
一次读取整个数据的系统调用,例如:
#include <unistd.h>
#include <fcntl.h>
...
char rawData[102400];
int file = open("/proc/12345/smaps", O_RDONLY, 0);
auto bytesRead = read(file, rawData, 102400); // this returns 3722 instead of expected ~64k
close(file);
std::cout << bytesRead << std::endl;
// do some parsing here after null-terminating the buffer
...
cat
使用 strace 解析文件时,我看到它使用多次调用
read()
(每次读取也获得大约 3k 字节)直到
read()
返回 0 - 如
documentation 中所述的
read()
:
...
read(3, "7fa8db3d7000-7fa8db3d8000 r--p 0"..., 131072) = 3588
write(1, "7fa8db3d7000-7fa8db3d8000 r--p 0"..., 3588) = 3588
read(3, "7fa8db3df000-7fa8db3e0000 r--p 0"..., 131072) = 3632
write(1, "7fa8db3df000-7fa8db3e0000 r--p 0"..., 3632) = 3632
read(3, "7fa8db3e8000-7fa8db3ed000 r--s 0"..., 131072) = 3603
write(1, "7fa8db3e8000-7fa8db3ed000 r--s 0"..., 3603) = 3603
read(3, "7fa8db41d000-7fa8db425000 r--p 0"..., 131072) = 3445
write(1, "7fa8db41d000-7fa8db425000 r--p 0"..., 3445) = 3445
read(3, "7fff05467000-7fff05496000 rw-p 0"..., 131072) = 2725
write(1, "7fff05467000-7fff05496000 rw-p 0"..., 2725) = 2725
read(3, "", 131072) = 0
munmap(0x7f8d29ad4000, 139264) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
To see a precise snapshot of a moment, you can see /proc/<pid>/smaps file and scan page table.
Note: reading /proc/PID/maps or /proc/PID/smaps is inherently racy (consistent output can be achieved only in the single read call). This typically manifests when doing partial reads of these files while the memory map is being modified. Despite the races, we do provide the following guarantees:
1) The mapped addresses never go backwards, which implies no two regions will ever overlap.
2) If there is something at a given vaddr during the entirety of the life of the smaps/maps walk, there will be some output for it.
read()
中获得数据,我只能相信我获得的数据。称呼。
/proc/<pid>/smaps
的一致快照。以及 cat/using multiple
read()
返回的数据电话可能是垃圾取决于日月光比?
最佳答案
您受到 fs/seq_file.c 中内核缓冲区大小的限制,该缓冲区用于生成许多/proc 文件。
缓冲区是第一个 set to be the size of a page ,然后是指数 grown to fit at least one record , 然后塞满了 as many entire records as will fit ,但在能够适应第一个条目后不再增长。当内部缓冲区不能容纳更多条目时,读取结束。
关于linux - 获得/proc/pid/smaps 一致快照的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59737950/
在经历了DDOS攻击后,不知何故/proc/kcore非常巨大,我使用一个小的php类来检查当前的磁盘空间,以及已经使用了多少。 它显示以下内容: Total Disk Space: 39.2 GB
所以我从 ruby 移植了一个工具,可以在对象上定义回调 block ,我希望在设置回调的情况下调用它。所以基本上是这样的。 def set_block(&block) @new_kid_on
我定义了两个脚本:第一个脚本调用第二个脚本中的 proc。第二个脚本定义了一个命名空间 fooSpace , 定义了一个变量 fooValue内fooSpace , 并定义了一个过程 myProc内f
使用一个 proc 时,我的脚本工作正常(检索 sftp 提示)。但是当我尝试在 proc 中使用 proc 时,脚本卡住了,我不知道为什么。 请不要重构代码,这不是重点,我需要了解这里的问题。 工作
我想知道是否有一种方法可以识别某些proc文件中用于DMA映射的内存,例如mtrr和iomem,或者通过lspic -vv . 在我的/proc/mtrr中,只有一个无法缓存区域,它似乎几乎指向3.5
我有 2 个过程,它们一个接一个地调用。第一个过程使用 diff 功能并创建 file.txt。压缩文件后的过程。问题是当我运行脚本时,file.txt 是空的。当我注释掉压缩过程时,文件中打印了差异
我曾经认为 /proc/self 和 /proc/$$ 在 bash 终端中是一样的,但现在我发现它们是不同的。 我知道$$是当前进程的pid,/proc/self是当前运行的进程,应该是bash终端
在下面的程序中,我想在第 2 个过程中捕获数据包,而 ping 在第 1 个过程中运行。现在,如果我执行这个程序,proc 正在运行 ping 并退出它。有解决此问题的想法吗? 我的 TCL 代码:
在 proc 中,您可以获得 proc 名称(无需对其进行硬编码)吗?例如 proc my_proc { some_arg } { puts "entering proc [some way
我有一个自定义的 A10 存储库,我试图在其中创建一个能够读取 /proc/[pid]/some-file 的应用程序文件,例如stat和 status ,有点像 ps做。 看完这篇 answer很明
我是 TCL 的新人。我通过 Windows Vista 下的 DOS 窗口“tclsh85 FOD/Scripts/program1.tcl”执行 TCL 代码。 program1.tcl 包含“s
我想查看每个进程的精确内存量用作匿名页,因为匿名内存不能调出,因此精确跟踪此使用情况非常重要。 获取匿名页面总数的一种方法是读取/proc/meminfo AnonPages。 另一种方法是将 sma
在 Ruby 中,Proc.new { 'waffles' } 和 proc { 'waffles' } 之间有什么区别吗?我发现很少有人提到第二种语法。 使用 irb 进行测试,我没有发现任何明显的
我正在寻找有关Linux系统上/proc/net/nf_conntrack和/或/proc/net/ip_contrack文件内容的详细文档。 是的,我知道,有许多实用程序可以用人类可读的格式向我显示
而不是执行多个单独的 PROC FREQ一个非常大的数据集上的程序,我想通过执行单个 PROC FREQ 来提高效率与多个 TABLE声明。我们的 QA 流程需要表格标题,这很简单,只需一个 TABL
我想在 /proc/driver 下创建一个文件目录。我想使用像 proc_root_driver 这样的宏(或提供的其他东西)而不是明确使用“驱动程序/模块名称”。我用 create_proc_en
在 SQL Server 2005 中,我希望名为 LimitedUser 的用户只能运行一个过程: GRANT EXEC ON [usp_RunETL] TO [LimitedUser] 但是,该
考虑到以下两个过程: proc firstOne(): void = echo "X" proc secondOne(): void = echo "X" discard 它们
我想使用 PROC TABULATE 复制 PROC MEANS 的输出。原因是我希望将利润百分比(或利润率)作为 PROC MEANS 输出中的变量之一,但希望抑制一个或多个统计数据的计算,即会有一
我的目标是使数据适合具有正支持的任何分布。 (威 bool (2p)、 Gamma (2p)、帕累托 (2p)、对数正态 (2p)、指数 (1P))。第一次尝试,我使用了 proc univariat
我是一名优秀的程序员,十分优秀!