2016-12-20 2 views
0

Я реализовал концепцию общей памяти в 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; 
} 
+0

Вы запустили сервер перед запуском клиента? И оставьте сервер работать? Я попробовал, и код работал отлично для меня. – kaylum

+0

Да. Сначала я выполнил обработанный сервер, а затем скомпилировал клиент, а затем дал команду запуска. Первый раз мой код работал, но теперь он дал эту ошибку. – user7222892

+0

Тот факт, что shmget() терпит неудачу с «Нет такого файла или каталога» означает только то, что он не нашел сегмент с этим ключом (теперь он педантичен: не id - с id, мы обычно ссылаемся на возвращаемое значение shmget(), которое используется впоследствии). Вы проверили, что shmid - то же самое? Ваш код отлично работает в моей системе. –

ответ

0

Тот факт, что shmget() завершаются с ошибкой "Нет такого файла или каталога" означает только что он не нашел сегмент с этим ключом (теперь он педантичен: не id - с идентификатором, мы обычно ссылаемся на возвращаемое значение shmget(), которое используется впоследствии). Вы проверили, что shmid одинаково? Ваш код отлично работает в моей системе.

Просто добавлено главное() вокруг него. Надеюсь, это поможет вам.

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); 
Смежные вопросы