linux环境下使用fclose后出现段错误

beastsam 2020-01-17 03:22:21
最近在写一个tcp socket的小程序,读取一个文本的内容然后进行传输,程序运行时读取内容没问题,也把相应内容存到了buf中,但是当我调用fclose()函数时就会段错误。程序部分代码如下。之后我用gdb 查看core文件,显示iofclose出错。

可是有一点很奇怪,当我把这一段读取文件以及关闭部分单独写一个测试程序,却是正常执行,没有任何报错。

希望各位大神能指点我一下。



#define BUFFER_SIZE 512

char total[BUFFER_SIZE];
char cell1[BUFFER_SIZE];
char cell2[BUFFER_SIZE*2];
char cell3[BUFFER_SIZE*3];
char rBuffer[BUFFER_SIZE];

memset(total, '\0', BUFFER_SIZE);
memset(cell1, '\0', BUFFER_SIZE);
memset(cell2, '\0', BUFFER_SIZE*2);
memset(cell3, '\0', BUFFER_SIZE*3);
memset(rBuffer, '\0', BUFFER_SIZE);

int flenth = 0;
int rlenth = 0;
int num = 0;
int i = 0;
int a = 0;


FILE *fpCon = NULL;
fpCon = fopen("333.txt","r");
if(fpCon == NULL){
printf("读取文件错误\n");
return 1;
}

while(fgets(rBuffer, BUFFER_SIZE, fpCon))
{
//判断跳过文件头部注释
if ((rBuffer[0] == '#') || (rBuffer[0] == '\n')){
continue;
}

flenth = strlen(total);
rlenth = strlen(rBuffer);

if(flenth < BUFFER_SIZE){
strncat(total, rBuffer, BUFFER_SIZE-flenth);
flenth = strlen(total);
}

if(flenth == BUFFER_SIZE)
{
memcpy(cell1, total, BUFFER_SIZE);

memcpy(cell2, total, BUFFER_SIZE);
memcpy(cell2+BUFFER_SIZE, total, BUFFER_SIZE);

memcpy(cell3, total, BUFFER_SIZE);
memcpy(cell3+BUFFER_SIZE, total, BUFFER_SIZE);
memcpy(cell3+2*BUFFER_SIZE, total, BUFFER_SIZE);

printf("复制完毕\n");

if(fpCon != NULL){
fclose(fpCon);
}

break;
}

memset(rBuffer, '\0', BUFFER_SIZE);
}

//调用发送函数
mysend();


gdb报错内容:
Program terminated with signal 11, Segmentation fault.
#0 0x00007f8f7632401d in _IO_new_fclose (fp=0x886000) at iofclose.c:56
56 _IO_acquire_lock (fp);
(gdb) backtrace
#0 0x00007f8f7632401d in _IO_new_fclose (fp=0x886000) at iofclose.c:56
#1 0x0000000000400fde in sendRequest (server_sock_fd=4) at bad_new.c:76
#2 0x00000000004018e1 in main (argc=1, argv=0x7ffdb3015e78) at bad_new.c:304
[/color]




...全文
1716 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
码大哥 2020-05-26
  • 打赏
  • 举报
回复
你的代码中有越界到fclose的部分,fclose时就会出错.
寻开心 2020-01-17
  • 打赏
  • 举报
回复
缓存最好是 buffer_size+1, 且最后一个元素设置为0
避免buffer自身满的时候用strcat这种函数,从buffer当中读字符串的时候就越界

fclose之后, fpCon也赋值为NULL,避免二次调用close,当然二次处理怎么都是错

是否要关闭,应该是eof是否到达或者是不再使用了,是常规的判断基础
lin5161678 2020-01-17
  • 打赏
  • 举报
回复
引用 2 楼 beastsam 的回复:
[quote=引用 1 楼 lin5161678 的回复:] strlen(total) 结果是BUFFER_SIZE 说明必然是越界了 处理边界的时候 注意一下
谢谢,我修改了一下果然没报错。 可是我还是有个疑问,当我把这段单独写出一个测试用例,多次运行,结果却是正常的,请问这个是什么原因?[/quote]内存布局无法确定 越界之后修改了什么数据无法确定 导致什么结果无法确定 从崩溃到什么事都没发生都是正常的
寻开心 2020-01-17
  • 打赏
  • 举报
回复
我觉得是因为文件很长
每次读取buffer_size长度, 并进行处理, buffer是满的
所以长度等于buffer_size的部分被多次调用
因此fclose被多次调用,所以完蛋了

fclose后给这个文件做一个=NULL的赋值,你再看看

beastsam 2020-01-17
  • 打赏
  • 举报
回复
引用 1 楼 lin5161678 的回复:
strlen(total) 结果是BUFFER_SIZE 说明必然是越界了 处理边界的时候 注意一下
谢谢,我修改了一下果然没报错。 可是我还是有个疑问,当我把这段单独写出一个测试用例,多次运行,结果却是正常的,请问这个是什么原因?
lin5161678 2020-01-17
  • 打赏
  • 举报
回复
strlen(total) 结果是BUFFER_SIZE 说明必然是越界了 处理边界的时候 注意一下

70,027

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧