繁体   English   中英

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);

之后,我使用队列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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM