9
votes

fopen ne retourne pas

J'ai utilisé "fopen" dans un programme C pour ouvrir un fichier en mode Radique (R). Mais dans mon cas, j'ai observé que Fopen Call ne retourne pas. Il ne renvoie pas NULL ou Pointeur valide - L'exécution est bloquée à l'appel Fopen. Le correctif de fichier est absolument correct (j'ai déjà vérifié que) et il n'y a pas de problèmes liés à la permission. Quelqu'un peut-il s'il vous plaît dire ce qui pourrait être la raison de ce type si le comportement. Tout type d'aide est vraiment appréciable. Y a-t-il quelque chose de lié à GCC ou à GLIBC?

edit

voici le code exemple xxx

lorsque j'exécute ce code, je reçois uniquement la première impression (Avant d'appeler Fopen) et après ce programme arrête seulement. Donc, fopen ne complète pas son fonctionnement. Le fichier est un fichier de configuration simple avec '.conf' extension et ce fichier peut être ouvert par tous les autres moyens tels que VI, CAT, etc. Il ne devrait pas y avoir de problème connexe NFS. Système de fichiers est ext3.

Merci d'avance, Souvik


20 commentaires

Poster le code. Nous ne pouvons pas dire sans cela. Inclure les paramètres (avec des valeurs) que vous passez à Fopen.


Si vous ne pouvez pas publier votre code PLS poster un exemple de code dans le scénario!


Veuillez spécifier également le type du système de fichiers.


Si le fichier a été ouvert avec succès, la fonction renvoie un pointeur sur un objet de fichier utilisé pour identifier le flux sur toutes les opérations supplémentaires en impliquant. Sinon, un pointeur nul est renvoyé. renvoie-t-il un pointeur Null ? C'est différent de juste null.


Aussi laissez-nous savoir quel genre de fichier vous essayez d'ouvrir. Dans certains scénarios, tels que travailler avec des tuyaux et FIFOS, FOPEN peut bloquer jusqu'à ce que l'autre extrémité ait été ouverte par un autre processus.


Quel genre de fichier est-ce? Si la cible est une tuyau ( s_ififo dans STAT (2) ) sans écrivain, le lecteur bloquera (voir FIFO (7) ) .


Pouvez-vous ouvrir ce fichier en utilisant d'autres moyens comme chat? Une raison de plus possible est que le fichier est sur NFS.


@Souvik Poste quelques informations, les gens ont faim! :)


@ Time Machine: Il a déjà déclaré que l'appel bloque juste.


@ Time Machine: erm ... null est un alias pour un pointeur NULL. Non, les deux sont pas différents.


Remplacer Imprimerf () par FPRRTINF (STDRR,) suivi de FFLUSH (STDERR), comme il peut y avoir des problèmes de mise en mémoire tampon. Juste pour m'assurer que cela se bloque vraiment sur cette ligne. Il vaut également la peine d'être imprimé argv [1] avant fopen (). Et enfin, avez-vous essayé de courir le tout dans un débogueur?


Que gère votre programme avec strace show?


@Sergey: starr est absorbé si de rincer, il est inutile.


@R .. - Je l'ai dit auparavant aussi jusqu'à ce que je rencontrais une situation où Qdebug () de Qt imprimerait un message et FPRRINTF () à STDRERR ne serait pas. Après avoir examiné les sources Qdebug (), j'ai découvert que la FPRRTINF (StDrint) suivie de FLUSH (StDerr). Allez comprendre. Donc, il vaut mieux être sûr que désolé, surtout dans des cas comme celui-ci.


@ Sergey: Assez judicieusement, je pensais que je ne l'ai pas pensé, mais de le tester sur mon Mac, j'ai trouvé pour cette plate-forme au moins , il est vrai - STDRERR n'a pas besoin d'être rinçage.


Une seule variable n'est pas affichée dans l'extrait de code que vous donnez. Le contenu de argv [1] . Je vous recommande de faire un printf ("% s \ n", argv [1]); et vérifiez qu'il n'y a rien d'étrange sur la valeur transmise à fopen .


Peut-être le fichier est sur le système NFS et le réseau est lent / indisponible.


@Jeremy, c'était une situation très anormale. Comme un programme segfaulting immédiatement après FPRRINTF () ou quelque chose comme ça. Je ne me souviens pas de la plate-forme exacte, mais c'était soit Linux, soit HP-UX sur RISC. Et je ne pense pas que QT fait cela qui affleurait juste pour le plaisir.


@Sergey: Eh bien, il n'y a rien dans la norme POSIX que je puisse trouver pour dire que stardr doit être ignorée. C'est pourquoi j'ai qualifié mon commentaire précédent en disant qu'il est absorbé au moins sur le système d'exploitation X. Je ne prétends aucune réclamation concernant les plates-formes que je n'ai pas testées.


Si CAT peut ouvrir votre fichier, alors il y a quelque chose qui ne va pas avec votre code. Votre application est-elle multi-filetée? Êtes-vous certain que le nom du fichier est correctement transmis à fopen ()? Sauf si vous publiez plus de code ou donnez plus d'informations, nous ne pouvons pas vraiment en dire plus.


4 Réponses :


2
votes

Alors quoi? Fopen est autorisé à bloquer jusqu'à ce que le fichier ait été ouvert ou jusqu'à ce qu'il soit déterminé que l'accès soit refusé. Si vous avez un périphérique de stockage lent, il est absolument correct d'attendre que cela devienne disponible. Mais c'est un problème de système d'exploitation alors, pas C's.


0 commentaires

1
votes

Je remarque que vous ne fermez pas le fichier si vous l'ouvrez avec succès.

Est-il possible de vous le faire courir avant et de le tuer, et vous avez maintenant un processus qui a le fichier ouvert et verrouillé?

Si tel est le cas, peut-être que Fopen attend que le verrou soit libéré. ​​


2 commentaires

Une pensée intéressante, mais je ne vois aucun code de verrouillage là-bas. Même Windows permettra d'ouvrir des fichiers par plusieurs processus en mode Radique. Cette question est balisé Linux et Linux est encore plus pardonnant dans ce sens. Et en outre, il dit que d'autres programmes peuvent ouvrir ce dossier.


Un peu connexe: il est possible que certaines corruptions de mémoire aient écrit sur le mutex sur la liste de la liste de fichiers ouverte, provoquant fopen pour accrocher pour toujours dans pthread_mutex_lock ou équivalent. Si OP écoute l'une de nos réponses et il suffit d'exécuter strace , cela pourrait rapidement être confirmé ou réfuté.



-1
votes

est-il possible que vous ayez redéfini un symbole dans l'espace de noms réservé: soit quelque chose commençant par deux soulignes, un soulignement et une lettre majuscule, ou n'importe laquelle des fonctions de la bibliothèque C Standard C? Si tel est le cas, cela se traduit par un comportement indéfini, et il est possible que fopen finit en quelque sorte en appelant une partie de votre code au lieu du code correct dans la bibliothèque standard.

Cette question a une odeur de "informations manquantes" majeures. Je doute sérieusement que l'extrait de code dans la question ait le comportement OP a décrit lorsqu'il apparaît en lui-même dans principal , et je me demande si OP n'a pas fait de faux trucs, il ne nous disait pas de choses ...


1 commentaires

Devrait être un commentaire.



7
votes

Voici quelques raisons:

  • Vous avez une mémoire corrompue quelque part, et tous les paris sont éteints quant à ce qui se passe (gérez votre programme via Valgrind)
  • Vous appelez ce code à l'intérieur d'un gestionnaire de signal, fopen () n'est pas un signal ASYNC SA SA SA SA SA SA SA SA SA SA SA SA SA SOIT (une impasse pour le fichier * Mutex interne est-elle courante)
  • Le fichier est un FIFO , dans quel cas l'ouverture du fichier bloquera jusqu'à quelqu'un Ouvre le fichier à l'autre extrémité (lecture / écriture)
  • Le fichier est sur un montage NFS rassis.
  • Le fichier est un fichier spécial de caractère / bloc avec une sémantique qui ouvre des blocs jusqu'à ce que quelque chose d'intéressant se produise,

1 commentaires

Essayé le même code sur un autre PC et cela a fonctionné bien. Je ne sais pas ce qui a mal tourné avec mon PC. Quoi qu'il en soit, merci beaucoup pour toute l'aide et la suggestion.