segfault во время fclose()

fclose() вызывает segfault. У меня есть :

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

Я не делаю ничего, связанного с файлами в ... но это не влияет на это. Однако мой ГЛАВНЫЙ процесс взаимодействует с другим процессом через разделяемую память, где хранится pipeName; другой процесс fopen использует этот канал для чтения, чтобы связаться с MAIN.

Любые идеи, почему это вызывает segfault?

Спасибо, Христо


person Hristo    schedule 03.04.2010    source источник


Ответы (3)


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

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

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

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

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

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

person Brian R. Bondy    schedule 03.04.2010
comment
1. Это была опечатка. Я передаю pipeFD в fclose(). 2. Ставлю чек на NULL, а оказывается, что NULL. Как это заставляет работать? Я думал, что fopen создает файл, если этого имени файла не существует? - person Hristo; 04.04.2010
comment
@Hristo: Вы не можете закрыть, если fopen не увенчается успехом. fopen в настоящее время не работает, вам нужно проверить ошибку, чтобы понять, почему. - person Brian R. Bondy; 04.04.2010
comment
да, fopen не работает. Я просто заменил w + вместо w для fopen, и теперь это работает ... не знаю, почему. но я не обязательно хочу читать и писать. - person Hristo; 04.04.2010

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

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

person Chris Dodd    schedule 03.04.2010
comment
Спасибо за ответ. Оказывается, fopen не работает. - person Hristo; 04.04.2010

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

person WhirlWind    schedule 03.04.2010
comment
мои извинения... я закрываю pipeFD... это опечатка - person Hristo; 04.04.2010