gpt4 book ai didi

c - 派生一个不使用自己的内存副本的子进程

转载 作者:行者123 更新时间:2023-11-30 19:11:51 25 4
gpt4 key购买 nike

我想要实现的目标如下:生成一个新的子进程(pchild),它不使用自己的子进程,而是使用其父进程(pparent)的内存块。

为什么我想实现这种行为:考虑多个测试,其中第一个测试导致 segvault。通常,您的进程会由于段错误而在此停止,所有其他测试将不再执行。因此我想将每个测试封装在它自己的过程中。

主要问题:一旦我生成一个进程,它就会获得自己的内存副本(好吧,我是意识到由于“写时复制”技术,这并不完全适用于所有操作系统)。想想例如测试树功能,其中我有一个节点结构,该结构有两个指向其他节点的指针。一旦我通过例如检索节点使用管道或某些共享内存块,这些指针指向属于 pchild 内存块一部分的地址,因此当我尝试从 pparent 通过跟踪节点结构内的指针来获取子节点时,我会得到一个 segvault。

由于某些操作系统在发生段错误时的主要行为,因此线程没有用处。 (由于“状态不明”而杀死 child 和父亲)。

到目前为止我所拥有的(仅 fork 测试部分):

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的内存段。我欢迎任何关于如何做到这一点的想法。问候,拉尔斯

最佳答案

你的问题不是很清楚,但我认为你有一个XY problem .

我的理解是,您想要运行一系列测试,其中每个测试都会看到先前成功测试的结果,但不会看到崩溃/失败的测试。如果是这种情况,一种方法是:

  1. 在每次测试之前 fork
  2. 在子级中执行测试。
  3. 如果测试成功,则让父级退出或只是等待子级再次 fork 并在其子级中执行下一个测试。如果测试失败,则让父进程再次fork进行下一次测试。

另一种方法可能是将您的数据结构仅保存在mmap使用MAP_SHARED|MAP_ANON分配的共享内存中,但是如果进行测试让它们处于不一致的状态,所有 future 的测试结果都将是垃圾。

在进程之间共享所有内存的想法在技术上是可行的,但它会立即失败,因为它们会破坏彼此的状态。

关于c - 派生一个不使用自己的内存副本的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38793183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com