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

标签 c memory fork ipc

我想要实现的目标如下: 生成一个新的子进程(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/

相关文章:

c - 如何调用链接列表中的特定条目? C

c++ - 如何在用户数据中存储值类型?

在 TensorFlow 中使用 GPU 时的内存管理

c++ - 指针的大小是多少?它具体取决于什么?

php - 清除 PHP 正在使用的内存

linux - C中使用exit()和wait()从子进程向父进程返回值

c - 在C中使用指针?使困惑

c - 当线程 fork 时会发生什么?

c - argv[n] 是可写的吗?

c - 告诉 makefile 在不同的目录中搜索 C 头文件