代码之家  ›  专栏  ›  技术社区  ›  Hristo

fclose()期间的segfault

  •  4
  • Hristo  · 技术社区  · 14 年前

    fclose()导致SegFault。我有:

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

    我不做任何与文件相关的事情…但这并不影响它。但是,我的主进程通过存储pipename的共享内存与另一个进程通信;另一个进程fopen的这个管道用于读取和主进程通信。

    你知道为什么这会导致一个SegFault吗?

    谢谢, 希斯托

    3 回复  |  直到 14 年前
        1
  •  2
  •   Brian R. Bondy    14 年前
    1. 通过 pipeFD fclose . FSEX 按文件句柄关闭文件 FILE* 不是文件名 char* . 用C(与C++不同),你可以做指针类型的隐式转换(在这种情况下,char到file *),这就是bug的来源。

    2. 在调用前检查pepefd是否为非空 FSEX .

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

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

    示例输出:

    出现以下错误:没有此类文件或目录

        2
  •  2
  •   Chris Dodd    14 年前

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

    你可以尝试使用 valgrind 或者其他内存损坏检查程序,看看它是否能告诉您任何信息。或者在调试器中的pipefd变量地址上使用数据断点。在文件本身上使用一个数据断点是很困难的,因为它有多个字,并且可以通过正常的文件I/O操作进行修改。

        3
  •  1
  •   WhirlWind    14 年前

    应该关闭pipefd而不是pipename。