【问题标题】:Shared structure for different processes不同进程的共享结构
【发布时间】:2013-01-11 07:09:31
【问题描述】:

我需要在 C/C++ 中的不同可执行文件之间定义一个共享结构。我怎样才能做到这一点? 在我的 starter.c 文件中:

pid_t child = fork();
if (child > 0) {
  // Parent.
  ... // detach shared memory
  argv[0] = "./app1";
  execv(argv[0], argv);
}
else {
  // Child.
  argv[0] = "./app2";
  execv(argv[0], argv);
}
  • start.h -> 定义共享结构
  • start.c -> 创建对象和fork(如上面的代码)
  • app.c -> 使用共享结构

更新:

  • 如果我在 start.h 处定义一个类,我会遇到分段错误, 在共享内存中的 fork() 之前创建它(使用 MAP_SHARED),并在 app1.c 中访问它的成员(如 shared_class->s)

  • 所以问题是:如何在执行后保持类/变量不变?

【问题讨论】:

  • 这个问题特别不清楚。您能否发布一些与共享内存映射相关的代码,并具体说明您的障碍是什么?
  • 假设我已经分叉并使用了类似于上面代码的 execv。因此,有一个 starter.c 文件和一个 app.c 文件。我应该如何定义一个可以被该方法派生的所有现有进程访问的共享结构(或变量)?
  • 您是在询问一种在进程之间发送/接收数据的方法吗?
  • @frozenkoi:不需要实现点2点连接。只是一个可供所有进程访问的共享缓冲区
  • 什么是app.c,什么是starter.c?

标签: c parallel-processing exec fork shared-memory


【解决方案1】:

如果你有一个共享结构,为什么不在一个单独的 .h(header) 文件中声明它,并将它作为头文件包含在你的 starter.c 和 app.c C 文件中。

如果您必须独立编译它们,您可以继续使用共享内存。如果您将结构加载到共享内存中,那么您的两个进程都可以毫无问题地访问它们!

【讨论】:

  • 我想为所有进程定义一个共享结构。 starter.c 和 app.c 是独立编译的。它们可以被认为是不同的进程/应用程序。
  • 谢谢,但这不是答案!您提出的方法将制作该结构/变量的 2 个不同副本。通过共享,我的意思是作为一个实体(而不是副本)对所有进程可见/可访问
  • @Computer_guy 你好,你错了....从共享内存读取和写入数据不会创建两个差异副本....在继续之前您需要更好地了解 C!
  • 我很清楚自己在做什么。问题是我还没有在我的进程之间共享内存的机制。如果我实现它,问题显然会得到解决!
【解决方案2】:

不知道你用的是什么平台。

如果是linux的话。 你可以使用mmap。

首先使用shm_open创建共享内存映射文件。

然后将其映射到您创建的每个可执行文件中。

在共享内存中写入/读取结构。

您的所有进程都可以访问相同的共享内存。

您可能需要找到一些 mmap 教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2014-06-14
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多