J'ai une application multithread qui s'ouvre et lit le même fichier (pas d'écriture). J'ouvre un descripteur de fichier différent pour chaque thread (mais ils pointent tous vers le même fichier). Chaque thread lit ensuite le fichier et peut le fermer et l'ouvrir à nouveau si EOF est atteint. Est-ce correct? Si j'effectue fclose() sur un descripteur de fichier, cela affecte-t-il les autres descripteurs de fichiers qui pointent vers le même fichier?Descripteurs de fichiers multiples vers le même fichier, C
Répondre
C'est bon. Vous pouvez ouvrir toutes les fois que vous voulez le même fichier et chaque descripteur de fichier sera indépendant l'un de l'autre.
Cela devrait fonctionner correctement, à condition que chaque thread ait sa propre poignée de fichier. Puisque vous mentionnez l'utilisation de fclose()
, cela suggère que vous utilisez également fopen()
dans chaque thread et que chaque thread affecte uniquement sa propre variable FILE *
.
Y a-t-il un problème?
Pour les systèmes Linux, vous n'avez pas besoin de plusieurs descripteurs de fichiers pour cela. Vous pouvez partager un seul descripteur de fichier et utiliser pread pour effectuer une opération de recherche/lecture de manière atomique sans modifier le descripteur de fichier.
'pread' est POSIX donc ce n'est pas limité à Linux. –
Fondamentalement, j'ai créé un tableau à 2 dim de pointeurs de fichiers (parce que chaque thread lira, disons, x fichiers), pour un total de y threads. donc mon tableau FILE * est array [y] [x]. Pour un thread donné, j'ouvre un fichier via fopen (array [i] [0]) par exemple (pour le fichier 0). Je lis alors (fread) le dossier (pas tout à la fois si) et fait d'autres tâches (aucune écriture de dossier se produit, cependant). Au cours d'une lecture, si EOF est atteint, je fais fclose puis à nouveau fopen. Mon souci était que, quand je devrais fermer et ouvrir, pourrais-je affecter d'une manière ou d'une autre les autres pointeurs FILE * des autres threads pointant vers le même fichier que j'ai exécuté f fermer o – Gigi
En supposant que 'fopen()' est une faute de frappe (il devrait être 'array [i] [0] = fopen' ...), alors oui, cela fonctionnera bien. A condition que chaque thread ne manipule pas les données appartenant à d'autres threads. – wallyk
Merci. Oui, tout ce que les threads font à ces fichiers sont fopen(), fread(), et fclose(). – Gigi