C 共享内存程序中的意外输出

C 共享内存程序中的意外输出,c,server,client,output,shared-memory,C,Server,Client,Output,Shared Memory,我有一个服务器,它可以创建一些共享内存空间,并将“helloworld”放在其中&一个客户端应该查看共享内存空间,并相应地将“helloworld”打印到控制台;然而,我得到的只是一个“*”字符&服务器并没有像预期的那样终止。下面是代码,任何关于如何修复此问题的见解都将不胜感激 服务器.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #

我有一个服务器,它可以创建一些共享内存空间,并将“helloworld”放在其中&一个客户端应该查看共享内存空间,并相应地将“helloworld”打印到控制台;然而,我得到的只是一个“*”字符&服务器并没有像预期的那样终止。下面是代码,任何关于如何修复此问题的见解都将不胜感激

服务器.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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义SHSIZE 100
int main(int argc,char*argv[])
{
int shmid;
钥匙(t)钥匙;;
char*shm;
char*s;
密钥=9876;
shmid=shmget(键、SHSIZE、IPC|U CREAT|0666);
如果(shmid<0)
{
佩罗尔(“shmget”);
出口(1);
}
shm=shmat(shmid,NULL,0);
如果(shm==(字符*)-1)
{
佩罗尔(“shmat”);
出口(1);
}
memcpy(shm,“你好,世界”,11);
s=shm;
s+=11;
*s=0;
而(*shm!=“*”)
{
睡眠(1);
}
shmdt(shm);//分离
shmctl(shmid,IPC_RMID,0);//解除分配
返回0;
}
客户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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义SHSIZE 100
int main(int argc,char*argv[])
{
int shmid;
钥匙(t)钥匙;;
char*shm;
char*s;
密钥=9876;
shmid=shmget(键、SHSIZE、IPC|U CREAT|0666);
如果(shmid<0)
{
佩罗尔(“shmget”);
出口(1);
}
shm=shmat(shmid,NULL,0);
如果(shm==(字符*)-1)
{
佩罗尔(“shmat”);
出口(1);
}
对于(s=shm;*s!=0;s++)
{
printf(“%c”,*s);
}
printf(“\n”);
*shm='*';
返回0;
}

我在一个运行gcc版本的opensuse 42.1机器上试用了您的程序

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> 
请检查您运行客户端和服务器的方式