【发布时间】: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