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

问题描述 投票:0回答:1

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

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

除了打印字符串外,它完美地工作。

第一个项目:

#define mykey 12345
#define perms 0666

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

int main(int argc, char **argv){

    int shmid;
    char *args[] = {"test2", NULL};
    struct pdata *ap;
    struct pdata p0={12, 'A', "PIPPO", 100};
    shmid = shmget(mykey, sizeof(struct pdata) * 1, perms | IPC_CREAT | IPC_EXCL);
    ap = (struct pdata*) shmat(shmid, NULL, 0);
    ap[0] = p0;

    printf("%s\n", ap[0].pname);
    if(execve("test2", args, NULL) == -1){
        printf("Errore execve\n");
    }

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

    return 0;
}

第二个方案:

#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;
}
c
1个回答
6
投票

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

例如,更改:

char *pname;

至:

char pname[512];

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

© www.soinside.com 2019 - 2024. All rights reserved.