传递具有共享内存的结构

时间:2013-06-16 07:29:08

标签: c struct posix shared-memory

您好我想在C(不是c#c++)中将我的结构从父亲传给儿子。 我的问题是解析共享内存中的数据并分享内存,我必须这样做我不能使用FIFO或其他系统

你可以假设结构operazione,我使用这个operazione structure[number]

的数组
typedef struct {
    int id;
    char operatore[1];
    int operandoprimo;
    int operandosecondo;
    int risultato;
    int risultato;
    int semid;
} operazione;
抱歉,有些评论是意大利语,但您可以轻松理解。

父亲:

 /* CREO ZONA DI MEMORIA */
   int shmid = cMemC(KEY_MEMORIA,righeoperazioni*(sizeof(operazione)),IPC_CREAT|0666);    
    // 

         // attacco memoria condivisa
          shm =attacMemC(shmid,NULL,0);

          s = shm;

          for(exa=0 ; exa<righeoperazioni ; exa++){

                sprintf(*s++,"%d",comandi[exa].id);
                sprintf(*s++,"%s",comandi[exa].operatore);
                sprintf(*s++,"%d",comandi[exa].operandoprimo);
                sprintf(*s++,"%d",comandi[exa].operandosecondo);
                sprintf(*s++,"%d",comandi[exa].risultato);
                sprintf(*s++,"%d",comandi[exa].semid);
                    }
           s=NULL;

    // 

儿子:

operazione comandif[righe];

/* CREO ZONA DI MEMORIA */
    int shmid = cMemC(KEY_MEMORIA,oper*(sizeof(operazione)),IPC_EXCL|0666);   
    // attacco memoria condivisa
    shmf =attacMemC(shmid,NULL,0);
    ss = shmf;
    exa=0;
    for(ss=0 ; ss != NULL ; ss++){
                            sprintf(temp,"%d",*ss);
                comandif[exa].id=atoi(temp);
                sprintf(temp,"%d",*ss);
                sprintf(comandif[exa].operatore,"%s",temp);
                sprintf(temp,"%d",*ss);
                comandif[exa].operandoprimo=atoi(temp);
                sprintf(temp,"%d",*ss);
                comandif[exa].operandosecondo=atoi(temp);
                sprintf(temp,"%d",*ss);
                comandif[exa].risultato=atoi(temp);
                sprintf(temp,"%d",*ss);
                comandif[exa].semid=atoi(temp);
                exa++;
           }

1 个答案:

答案 0 :(得分:1)

for循环使用sprintf()来“写入”共享内存是假的。 s的类型是什么?它的声明没有显示,但并不重要。如果它是char **,就像它应该使用它一样,你将多位数写入内存的“单字节”(它比这复杂一点,但它与复制结构没有任何相似之处你应该做的共享内存。)

您可能需要:

operazione *target = (operazione *)shm;
memmove(target, commandi, righeoperazioni * sizeof(operazione));

这将为您提供共享内存中commandi operazionememmove(shm, commandi, righeoperazione * sizeof(operazione)); 结构数组的副本。你实际上不需要目标变量;你可以使用:

{{1}}