【发布时间】:2016-08-05 15:46:42
【问题描述】:
我想要实现的是: 生成一个新的子进程 (pchild),它不使用自己的,而是使用其父进程 (pparent) 的内存块。
我为什么要实现这种行为: 考虑多个测试,其中第一个导致 segvault。 通常,由于段错误,您的进程会在此处停止,所有其他测试将不再执行。因此,我想将每个测试封装在自己的进程中。
主要问题: 一旦我产生了一个进程,它就会获得自己的内存副本(嗯,我是 意识到由于“写入时复制”技术,并非所有操作系统都完全正确)。想想例如测试树功能,其中我有一个节点结构,它有两个指向其他节点的指针。一旦我通过例如检索节点使用管道或某些共享内存块,这些指针指向一个地址,该地址是 pchild 内存块的一部分,因此当我尝试从 pparent 通过跟随节点结构内的指针来获取子节点时,我会得到一个 segvault。
线程没有用,因为一旦发生段错误,某些操作系统的主要行为。 (由于“状态不明”而杀死孩子和父亲)。
到目前为止我所拥有的(仅分叉测试部分):
int main (void) {
// forking
pid_t pid = fork();
if (pid < 0 ) {
// somewhat went wrong
printf("An error occured!");
} else if (pid != 0) { // inside parent
// closing writing end, as not needed
if(wait(NULL)!=0){
printf("Segfault in Child\n");
} else {
printf("Everyone is done!\n");
}
} else {
printf("Child forked");
char *s = (char *)0xDEADBEEF;
*s = 'a';
printf("this probally is never executed due to segfault\n");
}
return 0;
}
现在我的想法是尝试让 pchild 只访问 pparent 的内存段。 我欢迎任何关于如何做到这一点的想法。 问候, 拉尔斯
【问题讨论】:
-
您确定需要这个吗?如果一项测试崩溃,那么运行进一步测试有什么意义?
-
如果你在 Linux 上,你可以通过
clone()来实现这个疯狂的计划。 -
fork_and_exec gdb 并将其附加到主进程。
-
实际上,我真的不明白为什么在父内存的精确副本上进行测试与“在父内存上进行测试”有很大不同