1

1 つのプロセスから 2 つの IPC 共有メモリ セグメントを作成することはできませんか?

1 つのプロセスから 2 つの共有メモリを作成しようとしています。1 つは別のプロセスとデータを共有するため、もう 1 つはその子プロセスと共有するためです。私はshmgetを使用しています。また、システム内の共有メモリ情報をipcsで取得しようとしました。その出力は次のようなものです。

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x0beefbaf 0          root       666        225544     4                       
0x00000000 98305      root       666        4          0                       

上記の出力は、2 つの共有セグメントが作成されることを示していますが、shmget は出力として 0 しか返しません。したがって、1 つの共有メモリ セグメントが 2 回アタッチされます。

shmget の問題は何ですか、または 1 つのプロセスから 2 つの共有メモリを作成することはできません。

4

1 に答える 1

1

共有メモリ セグメントに同じキーを使用している可能性があります。複数の共有メモリ セグメントが必要な場合は、異なるキーを使用する必要があります。ftokキーを取得する標準的な方法については、man ページを参照してください。

過剰なメモリの使用を防ぐために、システム レベルの制限kernel.shmmaxと、関連する sysctl プロパティがあります。

これは、質問が求めることを正確に実行する非常に単純なサンプルアプリです。

#include <sys/shm.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>

int main(int argc, char **argv) {
     key_t key1;
     key_t key2;
     if (-1 != open("/tmp/foo", O_CREAT, 0777)) {
        key1 = ftok("/tmp/foo", 0);
     } else {
        perror("open");
        exit(1);
    }
    if (-1 != open("/tmp/foo2", O_CREAT, 0777)) {
        key2 = ftok("/tmp/foo2", 0);
    } else {
        perror("open");
        exit(1);
    }
    printf("%x %x\n", key1, key2);
    int id1 = shmget(key1, 0x1000, IPC_CREAT | SHM_R | SHM_W);
    int id2 = shmget(key2, 0x2000, IPC_CREAT | SHM_R | SHM_W);
    printf("%x %x\n", id1, id2);
    void *addr1 = shmat(id1, 0, 0);
    if (addr1 == (void *)-1) perror("shmat1");
    void *addr2 = shmat(id2, 0, 0);
    if (addr2 == (void *)-1) perror("shmat2");
    printf("%p %p\n", addr1, addr2);
    shmctl(id1, IPC_RMID, NULL);
    shmctl(id2, IPC_RMID, NULL);
}
于 2012-07-26T13:00:08.550 に答える