posix 在线程中创建共享内存

posix shared memory creation in thread

我是 Linux 编程新手,所以请多关照! .

我正在尝试实现上述场景。这里使用 fork() 创建了两个进程,每个进程都有 N 个线程。 来自进程 1 的线程创建一个请求并将其排入队列 1。来自进程 2 的线程使请求出列并将响应发送回队列 2。 每个请求由 shmidsize 组成,其中 shmid 是这样生成的共享内存段 -

shmid = shm_open(<a random string>, O_CREAT | O_RDWR | O_TRUNC, S_IRWXU | S_IRWXG);

if (shmid < 0) {
    perror("failure on shm_open");
    exit(1);
}
if (ftruncate(*share, size) == -1) {
    perror("Error on ftruncate\n");
    exit(-1);
}

创建后,我可以立即在同一线程中打开和修改此共享内存段

void* request = mmap(NULL, size, PROT_WRITE, MAP_SHARED, shmid, 0);
memset(str, 'w', size);

在此之后,我将 shmid 传递给使用队列 1 的进程 2。

我的问题是,当进程 2 中的线程尝试使用相同的方式打开此 shmid 时,出现 EBADF: fd is not a valid file descriptor 错误。我已经通过在进程 1 和 2 中打印值来验证出列后 shmid 是正确的。

当从不同的 process/thread 创建进程时,是否无法在进程之间创建共享内存段?关于如何让它工作的任何想法?

如果需要更多信息,请告诉我。

如果您试图访问由另一个进程创建的文件描述符,它将无法工作。文件描述符仅在创建它们的过程中有效。我之所以这么说是因为您看到的错误。

但是你对共享内存有正确的想法,你可以为两个进程创建一个共享的映射内存段,这可能会因竞争条件而变得毛茸茸,每个进程中的多个线程竞争访问它,或者你可以创建一个套接字,并让您的两个进程通过它或管道进行通信。

我会像您想要实现的那样为 IPC 推荐一个 AF_UNIX 套接字。

共享内存段必须在两个进程中打开。

如果两个进程都是由 fork() 从一个共同的父进程创建的,那么您可以在 fork() 之前执行 shm_open(),它将被两个子进程继承.

或者,每个进程都可以调用 shm_open(),为 name 参数传递相同的值。