- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请帮助我理解为什么这个函数在到达 fclose 时抛出异常:
void receive_file(int socket, char *save_to, int file_size) {
FILE *handle = fopen(save_to,"wb");
if(handle != NULL) {
int SIZE = 1024;
char buffer[SIZE];
memset(buffer,0,SIZE);
int read_so_far = 0;
int read_now = 0;
int reading_unit = (file_size < SIZE) ? file_size : SIZE;
do {
read_now = read(socket,buffer,reading_unit);
fwrite(buffer,read_now,1,handle);
read_so_far += read_now;
if(read_so_far >= file_size) {
break;
}
memset(buffer, 0, sizeof(buffer));
} while (1);
read_now = 0;
fclose(handle);
}
else {
extern int errno;
printf("error creating file");
printf(" error code : %d",errno);
exit(-1);
}
}
Eclipse CDT 存在以下错误:
Single stepping until exit from function __kernel_vsyscall, which has no line number information.
The purpose of this function is to receive a file through a socket.
EDIT: I'm using CentOS 5.3. The thing is, the file is created and written. Even the MD5 is correct. I don't understand why it's failing at fclose.
EDIT2: here is a stack trace I managed to get :
*** glibc detected *** /home/linuser/workspace/proj/Debug/proj: free(): invalid next size (normal): 0x096a0068 ***======= Backtrace: =========/lib/libc.so.6[0x4fb0f1]/lib/libc.so.6(cfree+0x90)[0x4febc0]/lib/libc.so.6(fclose+0x136)[0x4e9c56]/home/linuser/workspace/proj/Debug/proj[0x8048cd8]/home/linuser/workspace/proj/Debug/proj[0x80492d6]/home/linuser/workspace/proj/Debug/proj[0x804963d]/lib/libc.so.6(__libc_start_main+0xdc)[0x4a7e8c]/home/linuser/workspace/proj/Debug/proj[0x8048901]======= Memory map: ========001ff000-00200000 r-xp 001ff000 00:00 0 [vdso]0046f000-00489000 r-xp 00000000 08:06 1280361 /lib/ld-2.5.so00489000-0048a000 r-xp 00019000 08:06 1280361 /lib/ld-2.5.so0048a000-0048b000 rwxp 0001a000 08:06 1280361 /lib/ld-2.5.so00492000-005d0000 r-xp 00000000 08:06 1280362 /lib/libc-2.5.so005d0000-005d2000 r-xp 0013e000 08:06 1280362 /lib/libc-2.5.so005d2000-005d3000 rwxp 00140000 08:06 1280362 /lib/libc-2.5.so005d3000-005d6000 rwxp 005d3000 00:00 0 005d8000-005fd000 r-xp 00000000 08:06 1280369 /lib/libm-2.5.so005fd000-005fe000 r-xp 00024000 08:06 1280369 /lib/libm-2.5.so005fe000-005ff000 rwxp 00025000 08:06 1280369 /lib/libm-2.5.so009b2000-009bd000 r-xp 00000000 08:06 1280372 /lib/libgcc_s-4.1.2-20080825.so.1009bd000-009be000 rwxp 0000a000 08:06 1280372 /lib/libgcc_s-4.1.2-20080825.so.1009c5000-00aa5000 r-xp 00000000 08:06 5465873 /usr/lib/libstdc++.so.6.0.800aa5000-00aa9000 r-xp 000df000 08:06 5465873 /usr/lib/libstdc++.so.6.0.800aa9000-00aaa000 rwxp 000e3000 08:06 5465873 /usr/lib/libstdc++.so.6.0.800aaa000-00ab0000 rwxp 00aaa000 00:00 0 08048000-0804a000 r-xp 00000000 08:06 4884214 /home/linuser/workspace/proj/Debug/proj0804a000-0804b000 rw-p 00001000 08:06 4884214 /home/linuser/workspace/proj/Debug/proj096a0000-096c1000 rw-p 096a0000 00:00 0 [heap]b7e00000-b7e21000 rw-p b7e00000 00:00 0 b7e21000-b7f00000 ---p b7e21000 00:00 0 b7f99000-b7f9a000 rw-p b7f99000 00:00 0 b7faa000-b7fac000 rw-p b7faa000 00:00 0 bfa82000-bfa97000 rw-p bffea000 00:00 0 [stack]
and here is the "updated" version of the function :
void rec_file(int socket,char *path,int size)
{
FILE *handle = fopen(path,"wb");
char buffer[4096];
int total_read = 0;
if(handle != NULL)
{
while(1)
{
int bytes_read = recv(socket,buffer,4096,0);
total_read += bytes_read;
if(bytes_read != -1)
{
fwrite(buffer,bytes_read,1,handle);
}
else
{
printf("read error ");
exit(-1);
}
if(total_read >= size)
{
break;
}
}
fclose(handle);
}
else
{
printf("error receiving file");
exit(-1);
}
}
也许这更干净?但是,我仍然收到相同的 fclose 异常。
编辑3:我注释掉了所有内容,只留下了以下代码,可悲的是,它仍然在 fclose 处抛出异常:
void nrec(int sock,char* path,int size)
{
FILE *handle = fopen(path,"wb");
if(handle == NULL)
{
printf ("error opening file");
return;
}
fclose(handle);
}
最佳答案
fclose() 返回一个值:如果文件关闭成功则为 0,否则为 EOF。考虑将您的代码修改为...
if (fclose(handle)) { printf("错误关闭文件。");退出(-1);
正如其他人指出的那样,检查 read() 是否有错误。
如果崩溃发生在之后 fclose 返回 0(成功),并且所有 read() 都成功,那么问题可能出在别处。也许是 VLA。考虑将缓冲区代码更改为静态文件或 malloc/free。
如果调用者弄错了文件大小,例如声称文件为 500 字节,而实际上只有 480 字节,您的代码会一直读取套接字吗?
关于c - 为什么这个 C 函数在 fclose 时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/868992/
在我的程序中,我可能会关闭一个已经关闭的文件。当我对一个已经关闭的文件执行 fclose 时会发生什么? 如果不能这样做,如何知道文件是关闭还是打开? 最佳答案 使用同一流调用 fclose 两次是未
为什么如果我们使用 fread() 读取文件并且不包含 fclose 来关闭相同的相同文件引用但它仍然有效。 但是,如果我们忘记在 fwrite 之后包含 fclose,那么它就不起作用。即没有写入文
我在 Linux 中运行程序时遇到段错误错误。在 AIX 中工作正常。 我在 gdb 中收到消息段错误... 程序接收信号SIGSEGV,段错误fclose@@GLIBC_2.2.5 () 来自/li
是否需要检查fclose的返回值?如果我们成功打开了一个文件,它关闭失败的可能性有多大? 最佳答案 当您fwrite到文件时,它实际上可能不会写入任何内容,它可能会保留在缓冲区中(FILE对象内部)。
假设我正在写入文件,但我想通过关闭机器电源来结束写入,这会是 fclose() 函数没有被调用的问题吗? FILE *f = fopen("file.txt", "w"); if (f == NULL
我正在尝试读取一个整数文件,其中包含文件中的整数个数作为第一个整数,但是当我在读取文件后尝试关闭该文件时,出现了段错误。 我读到,如果文件指针为空并且您尝试关闭它,则会出现段错误。但是,我在关闭它之前
我有以下 C++ 代码来将 shorts 写入 headless 音频文件: vectornShrtDecoded; nShrtDecoded.resize(iCountDecodedShorts);
我的程序有问题。使用函数 fclose() 后出现错误: "* Error in `./server': corrupted double-linked list: 0x000000000251a23
我在这段代码中遇到问题,它成功执行直到到达 fclose(fp) 语句,它崩溃了。 void read_file(const char *filename) { FILE *fp; i
为什么这个简单的函数会导致seg fault? int main(int argc, char** argv) { FILE* file1; file1 = fopen(argv[ar
每当我在最后使用 fclose(outputFile); 运行我的程序时,我都会收到错误消息。 glibc 检测到...损坏的双链表 不过,令人困惑的是,我在它的正上方有 fclose(inputFi
我最近构建了一个包装库 gorilla-audio 的 Ruby C 扩展。该库足够简单,代码干净,占用内存等。但是,当我尝试将库加载到 ruby 中时,它会抛出一个错误,内容如下: The pr
我正在编写一个函数 (*rwObjects()),它将读取格式化文件并保存它的字符串,一次一个对象。不幸的是,它对我的研究有限制 - stdio.h、stdlib.h 和 string.h 几乎是
我已经通过评论缩减了程序,缩减为: #include #include int main(int argc, char *argv[]) { FILE * in; in = fop
这个问题在这里已经有了答案: What happens if I don't call fclose() in a C program? (4 个答案) 关闭 7 年前。 根据我的阅读,fclose
我有两个函数。第一个函数是以写入模式打开一个文件并写入一些内容,然后关闭它。 FILE *fp = fopen("file.txt", "w"); //writing itnot file using
我尝试在 Linux 机器上使用 c++ fopen、fwrite、fflush 和 fclose 函数创建大约 4 GB 的文件,但我观察到 fclose() 函数需要很长时间才能关闭文件,大约需要
下面是 fclose 导致错误的源代码的一小部分?此函数并不总是被调用,在某些特定情况下会调用此函数。 int write_into_file (char * file_name) {
我一直在尝试在 C 中进行简单的文件处理,我想确保可以尝试使用此文件访问该文件 #include main() { CheckFile(); } int CheckFile() { i
是否需要检查fclose的返回值?如果我们成功打开了一个文件,它关闭失败的可能性有多大? 最佳答案 当您fwrite 到一个文件时,它实际上可能不会写任何东西,它可能会留在缓冲区中(在 FILE 对象
我是一名优秀的程序员,十分优秀!