struct my_msg_st
{
int src;
int des;
int cmd;
int param;
char data[BUF_LEN];
int ack;
int arg;
int broadcast;
};
static void receive(int native_name, int dest_name, signal_callback scallback, void *arg)
{//asm("bkpt");
int msgid;
int running = 1;
struct my_msg_st some_data;
long int msg_to_receive = 0;
struct smpg_ipc_data ipc_data;
msgid = init_msg(native_name);
if(msgid == -1){
return ;
}
while(running){
printf("%x %x %x %x %x\n", msgid, (void*)&some_data, sizeof(struct my_msg_st), msg_to_receive, 0);
printf("&errno:0x%x", &errno);
asm("mov r31, r31");
if(msgrcv(msgid , (void*)&some_data, sizeof(struct my_msg_st), msg_to_receive, 0) ==-1){
if(errno != EINTR){
printf("msgrcv failed with error! errno:%d\n", errno);
}
return;
continue;
}
......
}
msgrcv系统调用传入的第二个参数并不是一个buffer,而是一个long型的type+buffer,所以第三个参数传入的不应该是sizeof(type+buffer),而是sizeof(buffer)。
所以上面定义的struct my_msg_st结构体需要注意,得定义一个type。
现在按照上面的这种写法,会导致msgrcv系统调用中拷贝数据越界4个字节,又由于some_data定义在堆栈中,可能会导致msgid等变量被破坏。