2017-02-15 7 views
0

私は共有メモリ空間を作成し、その中に "hello world"を入れたサーバを持っています&その共有メモリ空間を見て、コンソールに "hello world"したがって、しかし、代わりに私はちょうど "*"文字を取得しています&サーバはそれが想定されている通りに終了していません。以下はコードですが、これをどのように修正できるかについての洞察は高く評価されています。共有メモリプログラムで予期しない出力が発生しました

server.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 


#define SHSIZE 100 

int main(int argc, char *argv[]) 
{ 
    int shmid; 
    key_t key; 
    char *shm; 
    char *s; 

    key = 9876; 

    shmid = shmget(key, SHSIZE, IPC_CREAT | 0666); 
    if (shmid < 0) 
    { 
      perror("shmget"); 
      exit(1); 
    } 

    shm = shmat(shmid, NULL, 0); 

    if (shm == (char *) -1) 
    { 
      perror("shmat"); 
      exit(1); 
    } 

    memcpy(shm, "Hello World", 11); 

    s = shm; 
    s += 11; 

    *s = 0; 

    while (*shm != '*') 
    { 
      sleep(1); 
    } 

    shmdt (shm); // detach 
    shmctl (shmid, IPC_RMID, 0); //deallocate 
    return 0; 
} 

いるclient.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 


#define SHSIZE 100 

int main(int argc, char *argv[]) 
{ 
    int shmid; 
    key_t key; 
    char *shm; 
    char *s; 

    key = 9876; 

    shmid = shmget(key, SHSIZE, IPC_CREAT | 0666); 
    if (shmid < 0) 
    { 
      perror("shmget"); 
      exit(1); 
    } 

    shm = shmat(shmid, NULL, 0); 

    if (shm == (char *) -1) 
    { 
      perror("shmat"); 
      exit(1); 
    } 

    for (s = shm; *s != 0; s++) 
    { 
      printf("%c", *s); 
    } 

    printf("\n"); 

    *shm = '*'; 

    return 0; 
} 

答えて

0

私は(gccのバージョンで

gccのバージョン4.8.5を実行しているのopenSUSE 42.1のボックスのいずれかにあなたのプログラムの開発を試してみましたSUSE Linux)と出力は次のとおりです。あなたのプログラムは問題なく、出力を期待通りに与えます。以下の詳細に従ってください。

/WorkDir/checks/stackover> gcc -Wall -Wextra -O2 -o unx_sh_server unx_sh_server.c 
unx_sh_server.c: In function ‘main’: 
unx_sh_server.c:12:14: warning: unused parameter ‘argc’ [-Wunused-parameter] 
int main(int argc, char *argv[]) 
     ^
unx_sh_server.c:12:26: warning: unused parameter ‘argv’ [-Wunused-parameter] 
int main(int argc, char *argv[]) 
        ^
/WorkDir/checks/stackover> gcc -Wall -Wextra -O2 -o unx_sh_client unx_sh_client.c 
unx_sh_client.c: In function ‘main’: 
unx_sh_client.c:11:14: warning: unused parameter ‘argc’ [-Wunused-parameter] 
int main(int argc, char *argv[]) 
     ^
unx_sh_client.c:11:26: warning: unused parameter ‘argv’ [-Wunused-parameter] 
int main(int argc, char *argv[]) 

/WorkDir/checks/stackover> ls -rlt 
total 40 
-rw-r--r-- 1 progra users 761 Feb 15 09:29 unx_sh_server.c 
-rw-r--r-- 1 progra users 643 Feb 15 09:29 unx_sh_client.c 
-rwxr-xr-x 1 progra users 12768 Feb 15 09:30 unx_sh_server 
-rwxr-xr-x 1 progra users 12664 Feb 15 09:30 unx_sh_client 
/WorkDir/checks/stackover> ./unx_sh_server & 
[1] 12180 
/WorkDir/checks/stackover> 
/WorkDir/checks/stackover> 
/WorkDir/checks/stackover> ./unx_sh_client 
Hello World 
/WorkDir/checks/stackover> fg 
bash: fg: job has terminated`enter code here` 
[1]+ Done     ./unx_sh_server 
/WorkDir/checks/stackover> 

クライアントとサーバーの実行方法を確認してください。

関連する問題