int main(int argc, char *argv[]) {
pid_t pid;
char syscmd[80];
char *somebuffer=(char*)malloc(999999999l);
pid = fork();
if (0 == pid) { /* Child */
sprintf(syscmd, "pmap -x %d", getpid());
system(syscmd);
} else { /* parent */
wait(NULL);
}
return 0;
}
输出:
9822: ./a.out
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r-x-- a.out
0000000000600000 4 4 4 rw--- a.out
000000357e000000 128 24 0 r-x-- ld-2.12.so
000000357e21f000 4 4 4 r---- ld-2.12.so
000000357e220000 4 4 4 rw--- ld-2.12.so
000000357e221000 4 4 4 rw--- [ anon ]
000000357e400000 1572 120 0 r-x-- libc-2.12.so
000000357e589000 2048 0 0 ----- libc-2.12.so
000000357e789000 16 12 8 r---- libc-2.12.so
000000357e78d000 4 4 4 rw--- libc-2.12.so
000000357e78e000 20 16 16 rw--- [ anon ]
00007f64228ad000 976576 16 16 rw--- [ anon ]
00007f645e27b000 4 4 4 rw--- [ anon ]
00007f645e27c000 4 0 0 r-x-- [ anon ]
00007fff2a1eb000 84 12 12 rw--- [ stack ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 980480 228 76
::为什么那个大区域(可能还有其他区域)不是标记为私有区域?
谢谢!
答案 0 :(得分:0)
我认为pmap
程序无法打印此信息。为什么你使用像这样的奇怪实用工具而不仅仅是cat /proc/%d/maps
?
答案 1 :(得分:0)
我不确定pmap如何表示“copy-on-write”,我的印象是它在内核之外是不可见的(也就是说,你的第二个“anon”部分是你的malloc'd区域) ,但我可能是错的。这当然是我要找的地方,而且大小合适。您可以进行一些测量以查看是否填充内存两次(测量需要多长时间),然后在子进程中执行相同操作,您将看到第二次填充需要更少的时间,但是第一次分叉过程需要更长时间。
答案 2 :(得分:0)
更高版本的pmap有一个新选项`-X'。使用此选项,pmap在/ proc / pid / smaps
中显示详细信息