Я реализовал концепцию общей памяти в C на Ubuntu. Я создал два файла server.c и client.c, сначала я скомпилировал server.c, а затем скомпилировал client.c и запустил его. Но это показало ошибку. «Нет такого файла или каталога» Эта ошибка возникла в файле client.c, потому что запрошенный сегмент разделяемой памяти не найден. Пожалуйста, помогите мне, как я могу решить эту проблему.Нет такой ошибки файла или каталога в shmget
Вот мой код
server.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;
}
client.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;
}
Вы запустили сервер перед запуском клиента? И оставьте сервер работать? Я попробовал, и код работал отлично для меня. – kaylum
Да. Сначала я выполнил обработанный сервер, а затем скомпилировал клиент, а затем дал команду запуска. Первый раз мой код работал, но теперь он дал эту ошибку. – user7222892
Тот факт, что shmget() терпит неудачу с «Нет такого файла или каталога» означает только то, что он не нашел сегмент с этим ключом (теперь он педантичен: не id - с id, мы обычно ссылаемся на возвращаемое значение shmget(), которое используется впоследствии). Вы проверили, что shmid - то же самое? Ваш код отлично работает в моей системе. –