C++ 共享内存API,其中一个进程可以将共享内存附加到其他进程

C++ 共享内存API,其中一个进程可以将共享内存附加到其他进程,c++,linux,shared-memory,C++,Linux,Shared Memory,任何人都可以研究这个问题,并向我推荐一个API 我们有一个进程的API,它可以创建和/或将共享内存附加到自己的进程。但是我找不到一个API将共享内存逐个附加到另一个进程(例如,进程a应该调用一个API(如shmat())将共享内存附加到进程B) 共享内存不属于任何特定进程(除非您使用privateIPC\u private密钥创建它)。它属于系统 因此,当您将shmget与非私钥(以及IPC_create标志)一起使用时,您将创建共享内存块或附加到现有内存块 两个进程都需要一种方法来使用相同的I

任何人都可以研究这个问题,并向我推荐一个API


我们有一个进程的API,它可以创建和/或将共享内存附加到自己的进程。但是我找不到一个API将共享内存逐个附加到另一个进程(例如,进程a应该调用一个API(如shmat())将共享内存附加到进程B)

共享内存不属于任何特定进程(除非您使用private
IPC\u private
密钥创建它)。它属于系统

因此,当您将
shmget
与非私钥(以及
IPC_create
标志)一起使用时,您将创建共享内存块或附加到现有内存块

两个进程都需要一种方法来使用相同的IPC密钥,这通常是通过使用
ftok
来实现的,它使用文件规范和标识符为您提供一个IPC密钥,以便在
shmget
调用(以及其他IPC类型调用,如
msgget
semget
)中使用

例如,在程序
pax1
pax2
中,可能有如下代码段:

int getMyShMem (void) {
    key_t mykey = ftok ("/var/pax.cfg", 0); // only one shm block so use id of 0
    if (mykey == (key_t)-1)                 // no go.
        return -1;
    return shmget (mykey, 1024, IPC_CREAT); // get (or make) a 1K block.
}
通过让两个进程使用相同的文件规范和ID,它们将获得相同的共享内存块

您可以使用不同的ID为您提供基于同一文件的不同共享内存块(例如,您可能希望一个用于配置共享内存块,另一个用于存储共享状态)

而且,考虑到IPC密钥是基于您的配置文件,其他程序使用它的可能性很小(我认为可能是零,但我不是100%确定)


您不能从进程外部强制将共享内存注入到该进程中(当然,您可以这样做,但这既危险又需要各种根级别的权限)。这将打破受保护的进程模型,使您的系统变得像MS-DOS一样安全:-)

让我们看看,允许一个进程将共享内存段强制转移到另一个进程上吗?接收者将如何处理它?它将如何知道它现在已经映射了这个块-它的期望是什么

您思考问题的方式是错误的——简单地将一块内存提升到第二个进程上是不允许您做您想做的事情的。您还需要通知第二个进程,它现在已经映射了这个块,因此可以开始处理它。我建议你退一步,认真看看你的设计和你正在做什么。我建议的方法是

  • A通过其他IPC(如插座)连接到B
  • A通知B应附上详细信息(姓名等)
  • 然后B连接-现在B意识到了它,可以开始用它做事情了。(例如,连接完成后,B确认A,然后他们可以开始通过共享内存块进行对话)

  • 关于在一个漂亮的库中包装共享内存——考虑Booo::ItPoal.

    < p>您要求附加其他进程的进程内存,对吗?
    只需打开(2)文件
    /proc//mem
    ,然后使用它。检查
    /proc//map
    以查看文件中可用地址的列表。

    如果要为特定进程使用共享内存,需要在同一进程代码中调用shmget()或shmat()。然而,我想要一个API,它可以从一个进程调用,将共享内存连接到另一个进程。和我上面解释的一样。任何人都可以有相关的API,请建议。这是相同的API。它被称为共享内存,因为它是共享的!更一般地说,它被称为IPC,因为它是进程间(进程之间)的。您只需使用具有相同IPC键的
    shmget
    (如果您不确定它是否已经存在,则使用
    IPC\u create
    ),两个进程将查看相同的内存。从进程B强制共享内存到进程A中,我从来没有见过这样的API(而且有很好的理由)。我知道我们可以使用shmget在进程A中共享,我想要的是。。“我将从进程A调用shmget()(或任何相关API),但我希望它连接到进程B”您有任何此类API吗?好的,thnks’我将通过以下安全问题尝试API Windows确实有办法让进程A访问(非共享)进程B的内存空间。可能他们实现了这一点,以使密码窃取者、病毒作者等更容易操作。^P不过,如果Linux有类似的功能,我会感到惊讶。我说的是共享内存,而不是进程内存空间看到附加功能不是由进程B完成的,它应该由进程a完成(意味着将共享内存附加到进程B),我可以通过一些IPC发送共享内存地址。比如说套接字,附加完成。我想知道是否有API可以通过调用进程A中的附加函数(例如,shmat())将共享内存附加到进程B。我们知道shmat()将shm附加到其自己的流程中。这不是实际情况intention@candy为什么?如果你打算传播B需要的所有信息?我想在我的进程中使用共享内存,我不想在我的进程中创建/附加任何功能(调用l API),我想让另一个进程为我这样做(我的进程)。因此,从广义上讲,另一个进程应该像我的进程的共享内存管理器。它只需给我SHM地址,这就是我的实际地址requirement@candy,祝你好运找到这样的东西…嗯,这是一个完全多余的复杂因素,因为你必须做1-3以上无论如何。