我正在逆向设计一个使用Unix消息队列的程序(旧的,而不是Posix),我看到提供给msgsnd或msgrcv的大小不正确,它比它应该的大。示例:
struct requestmir {
long type;
char name[128];
int timeout;
long test;
};
int sizereqmir=sizeof(struct requestmir);
“sizereqmir”用于msgsnd但是根据某些网站,“type”(sizeof(long))的大小必须从“sizereqmir”中减去。
如果我们使用更大的尺寸(不减去类型的大小),是否会发生缓冲区溢出(没有后果)?因为程序运行正常,但我需要知道是否需要更正大小。
对于msgrcv,大小是否表示要读取的最大大小?如果将2条小消息发送到消息队列并且我只想读取一条消息但是我提供了一个大的大小,我会在缓冲区中找到2条消息,而我只想要一条消息吗?示例:
// in processes that send msg logs...
// shared struct
struct log{
long type;
char text[512];
};
struct log mess;
mess.type= 15;
//... put some text in log.text
if(msgsnd(msgqId,&mess,strlen(mess.text)+1, IPC_NOWAIT);
//....
// EOF #####
//*** in the process that read log msg from the message queue and write them to a file
struct log mess;
msgrcv(msgqId,&mess,512,0,0); //512 max text size
在最后的msgrcv中,我尝试从队列中读取最大512字节,如果2个不同的进程发送短日志消息,它们将在“乱七八糟”中找到,它是否正确?