segfault во время fclose () - PullRequest
       16

segfault во время fclose ()

4 голосов
/ 04 апреля 2010

fclose () вызывает ошибку по умолчанию.У меня есть:

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

Я не делаю ничего, связанного с файлами, в ... пока что это не влияет на это.Тем не менее, мой процесс MAIN связывается с другим процессом через общую память, где хранится pipeName;другой процесс fopen - это канал для чтения, чтобы связаться с MAIN.

Есть идеи, почему это вызывает ошибку segfault?

Ответы [ 3 ]

2 голосов
/ 04 апреля 2010
  1. Пропуск pipeFD до fclose. fclose закрывает файл по дескриптору файла FILE*, а не по имени файла char*. С C (в отличие от C ++) вы можете делать неявные преобразования типов указателей (в данном случае char * в FILE *), так что именно отсюда и ошибка.

  2. Проверьте, не является ли pepeFD ненулевым, перед вызовом fclose.

Редактировать: Вы подтвердили, что ошибка произошла из-за сбоя fopen, необходимо проверить ошибку следующим образом:

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

Пример вывода:

Произошла следующая ошибка: Нет такого файла или каталога

2 голосов
/ 04 апреля 2010

Сбой в fclose подразумевает, что переданный ему ФАЙЛ * был каким-то образом поврежден. Это может произойти, если сам указатель поврежден (проверьте в отладчике, чтобы убедиться, что он имеет то же значение в fclose, которое было возвращено fopen), или если структура данных FILE повреждена из-за какой-то случайной записи указателя или переполнения буфера где-то .

Вы можете попробовать использовать valgrind или какой-либо другой инструмент проверки повреждения памяти, чтобы узнать, может ли он вам что-то сказать. Или используйте точку прерывания данных в вашем отладчике по адресу переменной pipeFD. Использование точки останова данных на самом ФАЙЛЕ сложно, как его несколько слов, и модифицируется обычными операциями ввода-вывода файла.

1 голос
/ 04 апреля 2010

Вы должны закрыть pipeFD вместо pipeName.

...