Poster connexes: Delete folder with itemsPlus de pointeurs sur struct disponibles que désignés?
Comment peut plus pointeurs dans un tableau de pointeurs sur struct disponibles pour que désigné? Pour un outil d'apprentissage pour ftw/ftwn, j'ai réécrit la solution ftwn dans la publication associée (ci-dessus) pour ftw. Fondamentalement, en utilisant le callback ftw pour remplir un tableau de structures contenant le nom de fichier, le type et la profondeur de chaque fichier. La suppression de fichier est alors passée de maxdepth à 0 en supprimant les fichiers puis les répertoires en cours de route. C'était un test, donc printf
montre où unlink
ou rmdir
devrait être appelé et les commandes de suppression ne sont jamais exécutées.
Le stockage pour le réseau de structures a été essayé de trois manières différentes. (1) désignant statiquement le nombre de pointeurs disponibles struct _rmstat *rmstat [100];
(ftw 'nopenfd' mis à 200), (2) allocation dynamique struct _rmstat **rmstat;
et enfin (3) ajout de l'information à une liste chaînée. Tester l'allocation statique, j'ai spécifiquement choisi les répertoires de test avec moins de 100 fichiers, puis les répertoires avec plus de 100 fichiers, pour provoquer l'échec. À ma grande surprise, le test alloué statiquement traiterait automatiquement les répertoires contenant plus de 100 fichiers, et jusqu'à 450! Comment est-ce possible? Je pensais que l'allocation statique struct _rmstat *rmstat [100];
devrait garantir une erreur de segmentation (ou un vidage de noyau similaire) lorsque la 101e affectation de structure a été tentée. Y a-t-il quelque chose dans gcc qui fait cela dans l'allocation pile/tas? Ou, est-ce juste une partie de ce qu'est un comportement «indéfini»? Avec ftw, j'ai défini 'nopenfd' plus grand que les pointeurs de structure disponibles, donc je ne pense pas que cela soit le résultat de la limitation des fichiers de descripteurs ftw et de la fermeture/réouverture des fichiers.
J'ai recherché, mais je ne trouve pas d'explication sur la façon dont vous pourriez obtenir plus de pointeurs que ce que vous avez indiqué. Est-ce que quelqu'un ici sait comment cela peut arriver? Le test program source est disponible. Il est sûr - il supprime NOTHING, imprime simplement avec printf
. Construire avec: gcc -Wall -o rmftws rmdir-ftw-static.c
Merci pour toute idée que vous pouvez fournir.
Connexe: http://stackoverflow.com/q/2397984/951890 –