Comment faire pour rediriger la sortie d'un système d'appel à l'intérieur d'un programme en C/C++?
Je suis en train d'écrire un programme en C++ qui n'certains traitements spéciaux pour tous les fichiers dans le répertoire en cours sur le système d'exploitation Linux.
Je pensais donc à l'aide d'appels système comme system("ls")
pour obtenir la liste de tous les fichiers.
mais comment le stocker à l'intérieur de mon programme ? ( comment faire pour rediriger la sortie de la commande ls pour, disons, d'une chaîne que j'ai déclaré dans le programme )
Grâce
Vous devez vous connecter pour publier un commentaire.
Je vous suggère de ne pas appeler à
ls
- faire le travail correctement, en utilisantopendir/readdir/closedir
de lire directement le répertoire.Code de l'exemple, imprimer des entrées de répertoire:
readdir
dans un programme multi-threadé. Au lieu de cela, vous devez utiliserreaddir_r
Le consensus semble être de ne pas utiliser "ls". Cependant, pour quelqu'un qui est intéressé par une fonction pour ce faire:
Je ne pense pas que vous pouvez utiliser pour lire la sortie.
Essayez d'utiliser
popen
.Mais, vous ne voulez probablement pas à le faire pour
ls
. Deux raisons:readdir
), au lieu d'utiliser des commandes shell et l'analyser.ls
de sortie est une mauvaise idée.ls
.Une façon simple de le faire est d'utiliser le boost système de fichiers répertoire itérateur. Ou tout simplement utiliser les fonctions opendir/readdir/closedir comme d'autres l'ont suggéré. Il n'y a pas de réel avantage à la façon dont vous allez.
Exemple de Code, les formats d'impression pour régulièrement les fichiers dans un répertoire spécifié:
Êtes-vous sur UNIX ou Windows? Sur UNIX, vous devez créer un processus enfant avec l'appel fork (), puis de créer des pipes et affecter la sortie standard du processus enfant pour le STDIN du processus parent. Sur Windows il est lié à quelque chose de semblable dans l'API Win32.
L'Option 4. Utilisation popen();
Soit utiliser le approiate c appels pour lire les fichiers dans le répertoire ou vous généralisez votre programme de sorte qu'il prend une liste de fichiers en entrée et prendre cette liste de ls de canalisation à votre programme
Je vois 3 options:
system("ls > tempfile")
puis lire la sortie dels
de tempfilepipe()
, puis utilisezfork()
lancer un nouveau processus. De l'enfant dans le processus de fermer le fichier descripteur de 2, et le substitut à l'écriture de l'extrémité de la pipe pour en appelantdup()
. Ensuite, appelezexec("ls",...)
de l'enfant dans le processus. Enfin lire la sortie dels
de la conduite du processus parentls
de l'énumération des fichiers dans le répertoire courant. Il y a des fonctions pour le faire directement dans votre programme, c'est à direopendir(),readdir(),closedir
.Je recommande fortement l'option 3.
Je pense que n ° 2 de la pajton est la meilleure réponse à la question.
Il peut être "ls" n'est pas le meilleur exemple d'une commande pour laquelle vous souhaitez utiliser ce depuis qu'il y a d'autres natif fonctions de la bibliothèque C disponible pour ce faire, mais il y a d'autres programmes qui génèrent des sorties que vous souhaitez traiter immédiatement, sans avoir à effectuer de lecture/écriture de fichier.
#1 est aussi bon sur un UNIX/Linux type de système qui met en œuvre efficace de la mémoire RAM du système de fichiers qui peuvent être utilisés pour la lecture/écriture des données globales. Sur presque tous les systèmes, c'est vraiment une bonne 'quick 'n' sale' façon d'obtenir le travail fait.
Encore une fois, la plupart des réponses offrir de meilleures façons d'obtenir le contenu d'un répertoire à l'aide de natif de bibliothèques C, mais il existe des cas où des fonctions telles que la pipe(), fork(), dup(), exec(), system() et popen() sont appropriés pour la communication avec les processus du système.
À l'aide de la fourche()/exec() et pipe() appels système semble être la meilleure méthode générale sur Unix. Cela permet une meilleure séparation de la sortie standard et l'erreur standard volets du programme appelé. On peut aussi attendre sur le engendré de processus et de récolter, grâce à son statut de sortie. Finalement, on peut utiliser non-blocage I/O pour lire le programme appelé de sortie/erreur, en cas de besoin.
Le plus gros problème est que, pour arriver à quelque chose de similaire sur Windows, vous auriez éventuellement besoin d'écrire plusieurs centaines de lignes de code. Je n'ai pas trouvé une meilleure façon et n'ont pas étudié le problème dans le contexte Windows.
http://support.microsoft.com/kb/190351