【问题标题】:shm_open() leads to a No such file or directoryshm_open() 导致没有这样的文件或目录
【发布时间】:2017-04-18 21:37:32
【问题描述】:

说明:

我有一个名为“Projet”的项目目录,其中包含两个名为“Serveur”和“Client”的目录。

(1) Serveur 包含 serverur.c (2) Client 包含 client.c

参考the man,我选择了一个名字:“/shm_request_stack”。

源文件说明:

server.c:

#define SHM_REQUEST "/shm_request_stack"

int main(void) {
    sem_t shm = open_shm(SHM_REQUEST,
                         O_RDWR | O_CREAT | O_EXCL,
                         S_IRUSR | S_IWUSR);

    unlink_shm(SHM_REQUEST);

    size_t memsize = sizeof(int);
    setsize_shm(shm, memsize);

    int * ptr = project_shm(shm, memsize);
    *ptr = 0;

    while(*ptr == 0);
    printf("Client modify the value\n");
}

client.c:

#define SHM_REQUEST "/shm_request_stack"

int main(void) {
    sem_t shm = open_shm(SHM_REQUEST,
                         O_RDWR,
                         S_IRUSR | S_IWUSR);

    unlink_shm(SHM_REQUEST);

    size_t memsize = sizeof(int);
    int * ptr = project_shm(shm, memsize);

    *ptr = 1;
}

包络函数

int open_shm(char *name, int oflag, mode_t mode) {
    int shm = shm_open(name, oflag, mode);
    if (shm == -1) {
        fprintf(stderr, "Error while opening %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    return shm;
}

void unlink_shm(char *name) {
    if (shm_unlink(name) == -1) {
        perror("sem_unlink");
        exit(EXIT_FAILURE);
    }
}

void setsize_shm(int shm, size_t size) {
    if (ftruncate(shm, size) == -1) {
        perror("ftruncate");
        exit(EXIT_FAILURE);
    }
}

void * project_shm(int shm, size_t size) {
    int *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap");
        exit(EXIT_FAILURE);
    }
    return ptr;
}

问题:

客户端找不到服务器创建的命名shm。 我试图找到与ipcs -m 的共享内存,但我没有。

我尝试从服务器修改值,它可以正常工作,因此内存存在。

如何从客户端成功打开shm?

【问题讨论】:

  • 我尝试使用 sudo 启动这两个程序,但结果相同
  • 运行客户端时服务器还在运行吗?
  • 是的,他还在运行,等待修改值
  • 您似乎在创建共享对象后立即删除它 (unlink)!为什么?我认为这就是问题所在。将unlink 注释掉,然后重试。
  • 有点像文件。如果您有对该对象的开放引用,则它会被保留,但 unlink 会删除 name。这就是为什么服务器仍然可以在unlink 之后写入对象(shm 仍在范围内),但客户端无法通过名称打开对象。您引用的文档中的关键词是:“all open and map references” - 你不能做的是在unlock之后创建一个新的引用。

标签: c memory system shared-memory shared


【解决方案1】:

您似乎在创建共享对象后立即删除它 (unlink)。

有点像文件。如果您有对该对象的开放引用,则它会被保留,但 unlink 会删除该名称。这就是为什么服务器仍然可以在unlink 之后写入对象(she 仍在范围内),但客户端无法通过名称打开对象。

您引用的文档中的关键词是:“all open and map references” - 你不能做的是在unlink 之后创建一个新的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2020-09-25
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多