fclose()期间的SEGFULT
fclose()正在导致segfault。我有: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的该管道用于读取与主管道的
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 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,它现在似乎起作用了。。。不知道为什么。但是我不一定要读和写。谢谢你的回复。结果证明福彭失败了。