【问题标题】:Unexpected Output In Shared Memory Program共享内存程序中的意外输出
【发布时间】:2017-02-15 03:02:49
【问题描述】:

我有一个服务器,它创建一些共享内存空间并将“hello world”放入其中,一个客户端应该查看该共享内存空间并相应地将“hello world”打印到控制台;但是,相反,我只是得到一个“*”字符,并且服务器没有按预期终止。以下是代码,感谢您对如何解决此问题的任何见解。

服务器.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;
}

【问题讨论】:

    标签: c server client output shared-memory


    【解决方案1】:

    我已经在一个使用 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> 
    

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

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      相关资源
      最近更新 更多