fclose()导致了段错误。我有:
char buffer[L_tmpnam];
char *pipeName = tmpnam(buffer);
FILE *pipeFD = fopen(pipeName, "w"); // open for writing
...
...
...
fclose(pipeFD);
我没有在...中做任何文件相关的东西,所以这不会影响它。但是,我的MAIN进程通过存储pipeName的共享内存与另一个进程通信;另一个过程fopen这个管道用于阅读与MAIN沟通。
为什么会导致段错误?
谢谢, 赫里斯托斯
答案 0 :(得分:2)
将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);
}
示例输出:
发生以下错误:没有此类文件或目录
答案 1 :(得分:2)
fclose中的崩溃意味着传递给它的FILE *已经以某种方式被破坏了。如果指针本身已损坏,则会发生这种情况(检查调试器以确保它在fclose上具有与fopen返回的值相同的值),或者如果FILE数据结构被某些随机指针写入或某处的缓冲区溢出损坏
您可以尝试使用valgrind或其他内存损坏检查程序来查看它是否可以告诉您任何内容。或者在调试器中使用pipeFD变量地址的数据断点。在FILE上使用数据断点本身就像它的多个单词一样棘手,并且通过普通的文件i / o操作进行修改。
答案 2 :(得分:1)
您应该关闭pipeFD而不是pipeName。