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];
};
sizeof(pPoint->x) 即为 x 成员的大小, 由于 sizeof 是在编译时刻求值, 且 sizeof 不
会对其表达式求值计算, 只判断类型(当然包含定义), 所以:此时的 pPoint 的值可以是任意的哦~~~
当然, 这个任意, 是为了突显出 pPoint == NULL (0) 的情况, 话都说明了 ~~~
不定义结构体求成员大小的方式:
sizeof( ( (结构体名*)0 )->成员名 )
所以上面的那句可以写成:
msgrcv(msgid, &rmsg, sizeof(((struct msgbuf *)0)->mtext), 1, 0);
然后将发送消息队列的函数也照此修改
成功解决此问题
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);
然后将发送消息队列的函数也照此修改
成功解决此问题
相关文章推荐
- linux下编译C++程序出现错误 “*** stack smashing detected ***, eclipse解决方法
- Linux systemV 消息队列 IPC及Stack smashing detected解决方案
- 关于linux中使用vim打开文件出现^M的解决方法
- Asp.net中建立MS office组件时出现“拒绝访问”和“消息筛选器显示应用程序正在使用中”错误的解决方法
- 使用clonezilla做Linux备份及还原出现的问题及解决方法
- 关于linux中使用vim打开文件出现^M的解决方法
- linux3.0.1内核下V4L2接口使用zc301摄像头出现segment fault错误的解决方法
- Linux下使用Wine出现中文乱码的解决方法
- 使用ssh连接中文版linux时候出现乱码的解决方法
- 关于Linux中使用vim打开文件出现^M的解决方法
- IE浏览器下面 使用 JS的getDate()方法获取星期几出现Nan问题的解决办法
- Linux 创建消息队列时出现 No space left on device的处理方法
- 当RabbitMQ使用Publish发布消息出现数据格式问题的解决方法
- linux 上使用commons-net.jar中 FTPClient类的listFiles、retrieveFile等方法停止不执行,出现假死状态解决办法
- 关于PC机Linux (我的是红帽6.3)下使用dnw进行USB下载出现:can not open /dev/secbulk0解决方法
- linux下启动oracle sqlplus使用方向键出现[^A[B^[B^[D^ ^H的解决方法
- 关于linux中使用vim打开文件出现^M的解决方法
- 关于linux中使用vim打开文件出现^M的解决方法
- linux 上使用commons-net.jar中 FTPClient类的listFiles、retrieveFile等方法停止不执行,出现假死状态解决办法
- linux环境sqlplus中使用backspace键出现乱码的解决方法