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

原先使用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);

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

成功解决此问题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值