C:共享内存中的奇怪符号(UNIX)

时间:2017-12-29 01:10:26

标签: c

我创建了一个程序来测试共享内存的执行情况。

  • 一个进程创建共享内存并写入它。
  • 另一个从中读取。

除了打印字符串外,它完美无缺。

第一个程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>

#define mykey 12345
#define perms 0666

struct pdata{
    int ppid;
    char ptype;
    char *pname;
    unsigned long pgenome;
};

int main(){

    int shmid = shmget(mykey, sizeof(struct pdata) * 1, perms);
    struct pdata *ap;
    ap = (struct pdata*) shmat(shmid, NULL, 0);
    printf(
        "ap[0].ppid=%d\nap[0].ptype=%c\nap[0].pname=%s\nap[0].pgenome=%lu\n",
        ap[0].ppid, 
        ap[0].ptype, 
        ap[0].pname, 
        ap[0].pgenome
    );

    shmdt(ap);
    shmctl(shmid, IPC_RMID, 0);

    return 0;
}

第二个程序:

{{1}}

1 个答案:

答案 0 :(得分:6)

将指针放在共享内存中是没有意义的。接收进程现在知道另一个进程的内存空间中的字符串的地址,但这没有任何好处。相反,将字符串本身放在共享内存中。

例如,更改:

char *pname;

为:

char pname[512];

并适当调整程序的其余部分。