4

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

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

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

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

谢谢, 赫里斯托

4

3 回答 3

2
  1. 传给. pipeFD_ 通过文件句柄而不是文件名关闭文件。使用 C(与 C++ 不同),您可以对指针类型进行隐式类型转换(在本例中为 char* 到 FILE*),这就是错误的来源。fclosefcloseFILE*char*

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

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

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

示例输出:

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

于 2010-04-03T20:44:57.843 回答
2

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

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

于 2010-04-03T20:52:53.047 回答
1

您应该关闭 pipeFD 而不是 pipeName。

于 2010-04-03T20:43:59.360 回答