[英]posix shared memory creation in thread
我正在尝试实现上述方案。 在这里,使用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);
之后,我使用队列1将shmid传递到进程2。
我的问题是,当进程2中的线程尝试使用相同的方式打开此shmid时,我得到了EBADF: fd is not a valid file descriptor
错误。 我已经通过在进程1和2中打印值来确认出队后shmid是正确的。
如果从不同的进程/线程创建进程,则无法在进程之间创建共享内存段吗? 关于如何使它起作用的任何想法?
请让我知道是否需要更多信息。
如果您尝试访问由另一个进程创建的文件描述符,则该文件描述符将不起作用。 文件描述符仅在创建它们的过程中很有用。我之所以这么说是因为您看到的错误。
但是您有共享内存的正确想法,您可以为两个进程创建一个映射内存的共享段,这可能会使争用情况变得很麻烦,每个进程中都有多个线程竞争访问它,或者您可以创建一个套接字,并且让您的两个进程通过那个或管道进行通信。
我会建议您尝试实现IPC的AF_UNIX套接字。
共享内存段必须在两个进程中都打开。
如果两个进程都是由公共父节点的fork()
创建的,则只需在fork()
之前执行shm_open()
fork()
,它将被两个子进程继承。
另外,每个进程都可以调用shm_open()
,为name
参数传递相同的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.