fclose()期间的段错误

时间:2010-04-03 20:42:24

标签: c segmentation-fault fopen

fclose()导致了段错误。我有:

char buffer[L_tmpnam];
char *pipeName = tmpnam(buffer);
FILE *pipeFD = fopen(pipeName, "w"); // open for writing
...
...
...
fclose(pipeFD); 

我没有在...中做任何文件相关的东西,所以这不会影响它。但是,我的MAIN进程通过存储pipeName的共享内存与另一个进程通信;另一个过程fopen这个管道用于阅读与MAIN沟通。

为什么会导致段错误?

谢谢, 赫里斯托斯

3 个答案:

答案 0 :(得分:2)

  1. pipeFD传递给fclosefclose按文件句柄FILE*而非文件名char*关闭文件。使用C(与C ++不同),您可以对指针类型进行隐式类型转换(在本例中为char *到FILE *),这就是bug的来源。

  2. 在调用fclose之前检查pepeFD是否为非NULL。

  3. 编辑:您确认错误是由于fopen失败造成的,您需要检查错误,如下所示:

     pipeFD = fopen(pipeName, "w");
     if (pipeFD == NULL)
     {
       perror ("The following error occurred");
     }
     else
     {
       fclose (pipeFD);
     }
    

    示例输出:

      

    发生以下错误:没有此类文件或目录

答案 1 :(得分:2)

fclose中的崩溃意味着传递给它的FILE *已经以某种方式被破坏了。如果指针本身已损坏,则会发生这种情况(检查调试器以确保它在fclose上具有与fopen返回的值相同的值),或者如果FILE数据结构被某些随机指针写入或某处的缓冲区溢出损坏

您可以尝试使用valgrind或其他内存损坏检查程序来查看它是否可以告诉您任何内容。或者在调试器中使用pipeFD变量地址的数据断点。在FILE上使用数据断点本身就像它的多个单词一样棘手,并且通过普通的文件i / o操作进行修改。

答案 2 :(得分:1)

您应该关闭pipeFD而不是pipeName。