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 strud> p> voici le code exemple p> 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. P> Merci d'avance,
Souvik P> p>
4 Réponses :
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. P>
Je remarque que vous ne fermez pas le fichier si vous l'ouvrez avec succès. P>
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é? P>
Si tel est le cas, peut-être que Fopen attend que le verrou soit libéré. P>
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 code> pour accrocher pour toujours dans
pthread_mutex_lock code> ou équivalent. Si OP écoute l'une de nos réponses et il suffit d'exécuter
strace code>, cela pourrait rapidement être confirmé ou réfuté.
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 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 fopen code> finit en quelque sorte en appelant une partie de votre code au lieu du code correct dans la bibliothèque standard. P>
principal code>, et je me demande si OP n'a pas fait de faux trucs, il ne nous disait pas de choses ... p>
Devrait être un commentaire.
Voici quelques raisons: P>
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.
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é. Code> renvoie-t-il un pointeur Null B>? 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 code> dans
STAT (2) code>) sans écrivain, le lecteur bloquera (voir
FIFO (7) CODE>) .
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 code> est un alias pour un pointeur NULL. Non, les deux sont pas i> 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] code> avant fopen (). Et enfin, avez-vous essayé de courir le tout dans un débogueur?
Que gère votre programme avec
strace code> show?
@Sergey:
starr code> 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 i>, 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] code>. Je vous recommande de faire un
printf ("% s \ n", argv [1]); code> et vérifiez qu'il n'y a rien d'étrange sur la valeur transmise à
fopen code>.
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 i> ê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 code> 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.