2010-04-03 14 views
4

fclose() provoque une erreur de segmentation. J'ai:segfault pendant fclose()

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

Je ne fais pas de fichier choses liées à la ... mais si cela ne l'affecte pas. Toutefois, mon processus MAIN communique avec un autre processus via la mémoire partagée dans laquelle pipeName est stocké; l'autre processus fopen est ce tuyau pour la lecture à communiqué avec MAIN.

Des idées pour lesquelles cela provoque une erreur de segmentation?

Merci, Hristo

Répondre

2
  1. passe pipeFD à fclose. fclose ferme le fichier par le fichier FILE* pas le nom de fichier char*. Avec C (contrairement à C++), vous pouvez effectuer des conversions de types implicites de types de pointeurs (dans ce cas, char * vers FILE *), c'est de là que vient le bogue.

  2. Vérifiez que pepeFD n'est pas NULL avant d'appeler fclose.

Edit: Vous avez confirmé que l'erreur était due à fopen défaut, vous devez vérifier l'erreur comme ceci:

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

sortie Exemple:

L'erreur suivante a eu lieu: Aucun fichier ou répertoire de ce type

+0

1. C'était un faux type. Je passe pipeFD à fclose(). 2. J'ai mis une vérification pour NULL, et il s'avère que c'est NULL. Comment cela fonctionne-t-il? Je pensais que fopen crée le fichier si ce nom de fichier n'existe pas? – Hristo

+0

fopen échoue pour une raison quelconque. Qu'est-ce que perror()? – WhirlWind

+0

@Hristo: Vous ne pouvez pas fermer si le fopen ne réussit pas. fopen échoue actuellement, vous devez vérifier l'erreur pour voir pourquoi. –

1

Vous devez fermer pipeFD au lieu de pipeName.

+0

mes excuses ... Je ferme le pipeFD ... c'est un type erroné – Hristo

2

Un crash dans fclose implique que le FICHIER * qui lui est passé a été corrompu d'une manière ou d'une autre. Cela peut arriver si le pointeur lui-même est corrompu (vérifiez votre débogueur pour vous assurer qu'il a la même valeur à fclose que fopen), ou si la structure de données FILE est corrompue par un pointeur aléatoire ou un buffer overflow .

Vous pouvez essayer d'utiliser valgrind ou un autre correcteur de corruption de mémoire pour voir s'il peut vous dire quoi que ce soit. Ou utilisez un point d'arrêt de données dans votre débogueur sur l'adresse de la variable pipeFD. L'utilisation d'un point d'arrêt de données sur le FICHIER lui-même est délicate en tant que mots multiples, et est modifiée par les opérations normales d'entrée/sortie de fichier.

+0

Merci pour votre réponse. Il s'avère que fopen échouait. – Hristo