我在 Ubuntu 上用 C 实现了共享内存概念。我创建了两个文件 server.c 和 client.c ,首先我编译了 server.c 然后编译了 client.c 并运行它。但它显示了一个错误。 “没有这样的文件或目录” 此错误出现在 client.c 文件中,因为未找到请求的共享内存段。请帮助我如何解决这个问题。
这是我的代码
服务器.c
#include<sys/types.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#define SHMSIZE 100
int main()
{
int shmid;
key_t key;
char *shm, *s;
key=9876;
shmid=shmget(key,SHMSIZE,IPC_CREAT|0666);
if(shmid<0)
{
printf("%s",strerror(errno));
perror("Error in Shared Memory get statement");
exit(1);
}
shm=shmat(shmid,NULL,0);
if(shm== (char *) -1)
{
perror("Error in Shared Memory attachment");
exit(1);
}
memcpy(shm,"Hello World",11);
s=shm;
s+=11;
while(*shm!='*')
{
sleep(1);
}
return 0;
}
客户端.c
#include<sys/types.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#define SHMSIZE 100
int main()
{
int shmid;
key_t key;
char *shm, *s;
key=9876;
shmid=shmget(key,SHMSIZE,0666);
if(shmid<0)
{
printf("%s",strerror(errno));
perror("Error in Shared Memory get statement");
exit(1);
}
shm=shmat(shmid,NULL,0);
if(shm== (char *) -1)
{
printf("%s",strerror(errno));
perror("Error in Shared Memory attachment");
exit(1);
}
for(s=shm; *s!=0;s++)
{
printf("%c",*s);
}
printf("\n");
*shm='*';
return 0;
}
最佳答案
事实上,shmget() 失败并显示“没有这样的文件或目录”仅意味着它没有找到具有该键的段(现在迂腐:不是 id - 对于 id,我们通常指的是由shmget(),随后使用) - 您检查过 shmid 是否相同?你的代码在我的系统上运行良好。
刚刚在它周围添加了一个 main() 。希望对您有帮助。
key=9876;
shmid=shmget(key,SHMSIZE,0666);
if(shmid<0)
{
printf("%s",strerror(errno));
perror("Error in Shared Memory get statement");
shmid = shmget(key, SHMSIZE, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH | IPC_CREAT);
if (shmid == -1) {
printf("%s",strerror(errno));
perror("Error in Shared Memory get statement");
exit(1);
}
}
printf("Shmget() successful %d\n",shmid);
关于c - shmget中没有这样的文件或目录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41234677/