您好我想在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++;
}
答案 0 :(得分:1)
for
循环使用sprintf()
来“写入”共享内存是假的。 s
的类型是什么?它的声明没有显示,但并不重要。如果它是char **
,就像它应该使用它一样,你将多位数写入内存的“单字节”(它比这复杂一点,但它与复制结构没有任何相似之处你应该做的共享内存。)
您可能需要:
operazione *target = (operazione *)shm;
memmove(target, commandi, righeoperazioni * sizeof(operazione));
这将为您提供共享内存中commandi
operazione
个memmove(shm, commandi, righeoperazione * sizeof(operazione));
结构数组的副本。你实际上不需要目标变量;你可以使用:
{{1}}