2017-02-15 59 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

我已经试过你PROGRAMM上的openSUSE 42.1盒子之一,gcc版本

gcc版本4.8.5运行( 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> 

请检查您运行客户端和服务器的方式。