我希望这是一个简单的问题。我熟悉 unix/linux/etc 中的 fork 实际上并不复制整个映像,而是使用写时复制标志将共享内存映射为私有的想法。为了说明这一点,我尝试了下面的示例,我希望将大型 malloc 区域显示为私有(写入时复制)。但是,我得到下面的输出。任何人都可以帮助阐明这是为什么吗?我的假设是我的操作系统按预期工作(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
:: 为什么没有将那么大的区域(可能还有其他区域)标记为私有?
谢谢!