繁体   English   中英

Mmap和结构

[英]Mmap and structure

我正在使用信号量来编写一些代码,包括进程之间的通信。 我做了这样的结构:

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

并以这种方式使用(在主应用中和下属流程中相同)

container *memory;

shm_unlink("MYSHM"); //just in case
fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

if(fd == -1) {
    printf("Error");
    exit(EXIT_FAILURE);
}
memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
ftruncate(fd, sizeof(container));

当我使用sem_函数之一时一切都很好,但是当我尝试执行类似的操作时

memory->counter = 5;

没用 指针可能出了点问题,但是我尝试了几乎所有操作,但似乎没有任何效果。 也许有更好的方法在进程之间共享变量,结构等? 不幸的是,我不允许使用boost或类似的东西,该代码是出于教育目的,我希望尽可能地保持简单。

因为您在shm_open()之前立即使用shm_unlink() ,所以两个进程永远不会打开相同的共享内存对象-每个进程都在创建一个新的,不同的对象(即使它们具有相同的名称)。


您不清楚“无效”是什么意思。 以下基于您的代码的最小示例对我来说很好用。 它为您做什么?

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

int main()
{
    container *memory;
    int fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

    if(fd == -1) {
        perror("shm_open");
        return 1;
    }

    ftruncate(fd, sizeof(container));
    memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    memory->counter = 5;
    printf("%d\n", memory->counter);

    return 0;
}

在检查代码时,它失败了,因为您试图在exec()之后访问子进程中的文件描述符,并且shm_open默认情况下设置FD_CLOEXEC标志,因此文件描述符不再在子进程中打开。 因此,您只需要在主进程中取消设置该标志(例如,在shm_open之后检查错误之后):

fdflags = fcntl(fd, F_GETFD);
fdflags &= ~FD_CLOEXEC;
fcntl(fd, F_SETFD, fdflags);

为什么根本要打电话给shm_open? 一个很好的方法是在某个路径名上调用“ open”并使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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