2016-12-20 25 views
0

私はUbuntuのC言語で共有メモリの概念を実装していました。私は2つのファイルserver.cとclient.cを作成しました。まずserver.cをコンパイルしてからclient.cをコンパイルして実行しました。しかし、それは誤りを示した。 "No such file or directory" 要求された共有メモリセグメントが見つからないため、このエラーは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()が "No such file or directory"で失敗するという事実は、そのキーを持つセグメントを見つけられていないことを意味します私たちは通常、shmget()によって返される値を参照します。後で使用されます) - shmidが同じであることを確認しましたか? あなたのコードは私のシステムで正常に動作します。 –

答えて

0

はたshmget()は、 "そのようなファイルやディレクトリはありません" で失敗だけを意味しているという事実でありますそのキーを持つセグメントを見つけられていないことを示しています(現在はpedantic: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); 
関連する問題