gpt4 book ai didi

c - shm_open() 导致 No such file or directory

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:51 52 4
gpt4 key购买 nike

描述:

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

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

引用the man ,我选择作为名称:“/shm_request_stack”。

源文件说明:

服务器.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");
}

客户端.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?

最佳答案

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

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

您引用的文档中的关键词是:“所有打开和 map 引用” - 您不能做的是在取消链接 之后创建新引用。

关于c - shm_open() 导致 No such file or directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40958244/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com