原先使用redhat 5.0下面写了一个smtp和POP3的程序,使用消息队列进行通信,pop3的那个程序在单进程的时候运行正常,但是做成多线程就会出现段错误直接退出,后面使用多进程勉强实现功能。后面由于某些原因,转战到Ubuntu下面,环境是Lubuntu 13.0(轻量级的,适合在虚拟机中使用),然后做了一些小修改之后程序运行了,但是POP3的多进程程序出现了问题,每次和outlook进行锁步发送完邮件后总是加上一条*** stack smashing detected ***: ./pop3main terminated后面网上找了一些资料,原来是消息队列使用时出错:msgrcv(msgid, &rmsg, sizeof(struct msgbuf ), 1, 0)
其中消息队列结构体:
struct msgbuf
{
long mtype;
char mtext[256];
};
原因是:按照UC消息队列的机制,这260个字符时不计算mtype在内的,也就是你这260个字符都会被写在buf[]中,会导致栈溢出
所以msgrcv的第三个参数为256
但是如果直接写成256不利于以后程序的移植,所以可以通过指针反求得大小
比如有一个 POINT 类型的指针 pPoint, 那么:
sizeof(pPoint->x) 即为 x 成员的大小, 由于 sizeof 是在编译时刻求值, 且 sizeof 不
会对其表达式求值计算, 只判断类型(当然包含定义), 所以:此时的 pPoint 的值可以是任意的哦~~~
当然, 这个任意, 是为了突显出 pPoint == NULL (0) 的情况, 话都说明了 ~~~
不定义结构体求成员大小的方式:
sizeof( ( (结构体名*)0 )->成员名 )
所以上面的那句可以写成:
msgrcv(msgid, &rmsg, sizeof(((struct msgbuf *)0)->mtext), 1, 0);
然后将发送消息队列的函数也照此修改
成功解决此问题