【问题标题】:Not able to retrieve mmap shared memory from child after fork()fork() 后无法从子级检索 mmap 共享内存
【发布时间】:2013-11-22 22:36:35
【问题描述】:

更新:我无法让这个工作,并采取了不同的方法。正如@nos 指出的那样,问题不在于这段代码,而在于其他地方。 ArrayList 在其实现中分配内存,这不是我们分配的共享内存的一部分。感谢您的回复。

原问题:

我只有一个叉子。我的目标是让孩子填充一个数据结构(db - 它是一个 ArrayList - 外部实现),然后能够从父级读取该数据结构。目前,由于父进程中的数据结构为空,因此结果为 seg 错误。

代码如下:

    static ArrayList *db;
    pid_t child_pid, pid;
int child_status;

//set up shared memory structure
db = mmap(NULL, 20000, PROT_READ | PROT_WRITE, 
                MAP_SHARED | MAP_ANONYMOUS, -1, 0);


child_pid = fork();
if(child_pid == 0) {

    //Some operations to initialize and populate db happen here. This works fine.


    //printAll(db, 1); //THIS would work. But I want to do this from the parent
    exit(0);

} else {
    //wait for child process to finish

        do {
            pid = wait(&child_status);

        } while(pid != child_pid);




    printAll(db, 1);//THIS IS WHERE IT SEGFAULTS, because db is not initialized - so it was never properly retrieved from mmap
    munmap(db, 20000); //fixed this



}

【问题讨论】:

  • 为什么在你拥有 munmap'd ptr 之后,你会期望 printAll(ptr) 是安全的?
  • 操作系统是 ubuntu。移动了 munmap - 没有任何区别

标签: c multithreading fork mmap


【解决方案1】:
 munmap(db, 20000);

 printAll(db, 1);//T//THIS IS WHERE IT SEGFAULTS,

这并不奇怪,你在它上面的那一行取消了内存的映射。

【讨论】:

  • 已修复 - 仍然是同样的问题。
  • @llmar 那么你在其他地方有一个错误。您拥有的代码的 sn-p 将在父子之间正确共享内存,您可以通过小样本验证这一点,例如 ideone.com/e0BXFq ,您可以调试您拥有的代码并手动检查内存。跨度>
  • 你是对的,这很好用。我不确定错误在哪里——也许我的数据结构正在使用另一个存储在不同内存位置的结构。我将对此进行调查并发布更新。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2010-12-30
  • 2021-12-04
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多