fclose()期间的SEGFULT

fclose()期间的SEGFULT,c,segmentation-fault,fopen,C,Segmentation Fault,Fopen,fclose()正在导致segfault。我有: char buffer[L_tmpnam]; char *pipeName = tmpnam(buffer); FILE *pipeFD = fopen(pipeName, "w"); // open for writing ... ... ... fclose(pipeFD); 我不做任何文件相关的事情在。。。但这并不影响它。然而,我的主进程通过存储pipeName的共享内存与另一个进程通信;另一个过程是fopen的该管道用于读取与主管道的

fclose()正在导致segfault。我有:

char buffer[L_tmpnam];
char *pipeName = tmpnam(buffer);
FILE *pipeFD = fopen(pipeName, "w"); // open for writing
...
...
...
fclose(pipeFD); 
我不做任何文件相关的事情在。。。但这并不影响它。然而,我的主进程通过存储pipeName的共享内存与另一个进程通信;另一个过程是fopen的该管道用于读取与主管道的通信

你知道为什么这会导致SEG故障吗

谢谢,
Hristo

您应该关闭pipeFD而不是pipeName

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

  • 在调用
    fclose
    之前,检查pepeFD是否为非NULL

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

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

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


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


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

    我的道歉。。。我确实关闭了管道。。。这是一个错误的类型1。那是打字错误。我确实将pipeFD传递给fclose()。2.我检查了NULL,结果是NULL。这是怎么回事?我以为如果文件名不存在,fopen会创建该文件?@Hristo:除非fopen成功,否则无法关闭。fopen当前失败您需要检查错误以了解原因。是fopen失败。我只是用一个“w+”代替了一个“w”来替换fopen,它现在似乎起作用了。。。不知道为什么。但是我不一定要读和写。谢谢你的回复。结果证明福彭失败了。