0

嗨,我想将我的结构从父亲传给儿子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++;
           }
4

1 回答 1

1

用于“写入”共享内存的for循环是虚假的。sprintf()是什么类型的s?它的声明没有显示,但这并不重要。如果它是 a char **,因为它应该用于它的用途,那么您正在将多位数字写入内存的“单字节”(它比这更复杂一些,但它与将结构复制到共享内存中没有相似之处)应该做的)。

你可能需要:

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

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

memmove(shm, commandi, righeoperazione * sizeof(operazione));
于 2013-06-16T08:10:59.523 回答