【问题标题】:segfault during fclose()fclose() 期间的段错误
【发布时间】:2010-04-03 20:42:23
【问题描述】:

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

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

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

任何想法为什么这会导致段错误?

谢谢, 赫里斯托

【问题讨论】:

    标签: c segmentation-fault fopen


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

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

    编辑:您确认错误是由于 fopen 失败,您需要像这样检查错误:

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

    示例输出:

    发生以下错误:没有这样的文件或目录

    【讨论】:

    • 1.那是打错字了。我确实将 pipeFD 传递给 fclose()。 2.我检查了NULL,结果是NULL。那是如何工作的?如果该文件名不存在,我认为 fopen 会创建该文件?
    • @Hristo:除非 fopen 成功,否则您无法关闭。 fopen 当前失败,您需要检查错误以了解原因。
    • 是的 fopen 失败了。我只是用“w+”而不是“w”来代替 fopen,它现在似乎可以工作了……不知道为什么。但我不一定要读写。
    【解决方案2】:

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

    您可以尝试使用valgrind 或其他一些内存损坏检查器,看看它是否能告诉您任何信息。或者在调试器中对 pipeFD 变量的地址使用数据断点。在 FILE 本身上使用数据断点是很棘手的,因为它有多个单词,并且会被正常的文件 i/o 操作修改。

    【讨论】:

    • 感谢您的回复。事实证明 fopen 失败了。
    【解决方案3】:

    你应该关闭 pipeFD 而不是 pipeName。

    【讨论】:

    • 我很抱歉...我确实关闭了 pipeFD...这是一个错误的输入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2014-04-25
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多