c - pmap 和 fork : where is my copy on write flag?

标签 c fork pmap

我希望这是一个简单的问题。我很熟悉 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/

相关文章:

c - 编写我自己的 init 可执行文件

c - union 中 float 的内存分配

c - 帮助在 C 中实现 GNU Readline

r - map() 中是否有 "next"等效项

r - purrr 找到最小值,然后用 case_when 标记

c - C 中结构体指针指向哪个地址?

c - WHILE 循环显示与 FOR 循环不同的输出

C 子进程运行其代码两次

c++ - Linux c++ 中的 shmget() 函数

java - 当堆稳定时诊断 Java 中的 RSS 泄漏