我希望这是一个简单的问题。我很熟悉 unix/linux/etc 中的 fork 实际上并不复制整个图像,而是将共享内存映射为具有写时复制标志的私有(private)内存。为了说明这一点,我尝试了下面的示例,我希望它会将大型 malloc 区域显示为私有(private)(写入时复制)。但是,我得到以下输出。谁能帮助阐明这是为什么?我的假设是我的操作系统按预期工作 (uname -a: Linux xxxxxx 2.6.32-279.19.1.el6.x86_64 #1 SMP Tue Dec 18 17:22:54 CST 2012 x86_64 x86_64 x86_64 GNU/Linux) 但 pmap 是没有像我预期的那样工作..
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
::为什么那个大区域(可能还有其他区域)没有标记为私有(private)区域?
谢谢!
最佳答案
我认为 pmap
程序无法打印此信息。你为什么要使用这样一个奇怪的实用程序,而不仅仅是 cat/proc/%d/maps
?
关于c - pmap 和 fork : where is my copy on write flag?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13996382/