您的位置:首页 > 大数据 > 人工智能

Linux下面使用消息队列通信出现*** stack smashing detected ***: ./pop3main terminated的解决方法

2014-04-13 17:03 615 查看
原先使用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);

然后将发送消息队列的函数也照此修改

成功解决此问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐