posix 在线程中创建共享内存
posix shared memory creation in thread
我是 Linux 编程新手,所以请多关照!
.
我正在尝试实现上述场景。这里使用 fork()
创建了两个进程,每个进程都有 N 个线程。
来自进程 1 的线程创建一个请求并将其排入队列 1。来自进程 2 的线程使请求出列并将响应发送回队列 2。
每个请求由 shmid
和 size
组成,其中 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
参数传递相同的值。
我是 Linux 编程新手,所以请多关照!
.
我正在尝试实现上述场景。这里使用 fork()
创建了两个进程,每个进程都有 N 个线程。
来自进程 1 的线程创建一个请求并将其排入队列 1。来自进程 2 的线程使请求出列并将响应发送回队列 2。
每个请求由 shmid
和 size
组成,其中 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
参数传递相同的值。