免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9638 | 回复: 4
打印 上一主题 下一主题

用fclose关闭文件碰到的问题 [复制链接]

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-24 10:11 |只看该作者 |倒序浏览
先说一下基本的环境
用wmware6.0 在windowXP的机器上建了一个red hat enterprise linux 4的虚拟机。然后通过ssh secure shell client客户端连到虚拟机上写程序,用的 g++ 编译源代码。
我用fopen 打开一个文件获得文件指针fp,然后进行读操作,在退出程序前用fclose关闭fp。这是程序报错
SIGSEGV, Segmentation fault. 我用gdb调试发现程序死在 fclose函数中的free操作上。在调用fclose前检查fp的值,发现值没有变化。用 "p *fp"检查 *fp 结构的内容。close就是执行不了。

我又在调用fclose之前用ferror测试fp,返回值为0;用fread取文件内容,也没有报错,能读出数据。
但在fread成功后,马上调用fclose还是出错。

这是我的测试语句:

int ret = 0;
char buffer[1024];

printf("file error = %d\n",ferror(pFile->pFile));

ret = ftell(pFile->pFile);
printf("file pos = %d\n",ret);

fseek(pFile->pFile,0,SEEK_SET);

memset(buffer,0,1024);
ret = fread(buffer, 1, 10, pFile->pFile);
buffer[ret] = 0;
printf("buffer = %s:length = %d\n",buffer, ret);

fclose(pFile->pFile);

这是测试语句对应的输出:

file error = 0
file pos = 20
buffer = <a>
        <b>1<:length = 10



这是用gdb调试报的错误信息。

Program received signal SIGSEGV, Segmentation fault.
0x004dcb12 in _int_free () from /lib/tls/libc.so.6
(gdb) up
#1  0x004dd33a in free () from /lib/tls/libc.so.6
(gdb) up
#2  0x004cd746 in fclose@@GLIBC_2.1 () from /lib/tls/libc.so.6
(gdb) up
#3  0x08048ddf in FILE_close (pFile=0x804ba20) at ldr_file.c:95
95              fclose(pFile->pFile);
Current language:  auto; currently c++


请问一下有谁碰到过这种情况?是什么原因造成的?

[ 本帖最后由 wxycyel 于 2008-7-24 10:16 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-24 10:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
3 [报告]
发表于 2008-07-24 10:17 |只看该作者

回复 #2 aple_smx 的帖子

这些代码很简单的,没有花括号和缩进,不用对齐。

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
4 [报告]
发表于 2008-07-24 11:20 |只看该作者
是不是文件fclose了2次以上?
pFile是个对象吧,检查pFile对应的类,是不是析构函数中做fclose了?

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
5 [报告]
发表于 2008-07-24 12:45 |只看该作者
找到原因了,是内存越界的问题,分配内存时考虑不周,少了一个字节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP