GNU/Linux >> Tutoriels Linux >  >> Linux

Comment rediriger la sortie de system() vers un fichier ?

stdout est un FILE * pointeur du flux de sortie standard. dup2 attend un descripteur de fichier, vous avez également foiré l'ordre des paramètres.Utilisez

dup2(file, 1);

à la place.

Sur la meilleure façon de faire cette partie. Cette méthode est mauvaise car vous souhaitez probablement restaurer votre sortie standard après ce system l'appel se termine. Vous pouvez le faire de différentes manières. Vous pouvez dup quelque part, puis dup2 le remettre (et fermer le dup ped un). Personnellement, je n'aime pas écrire mon propre cat implémentations comme suggéré dans d'autres réponses. Si la seule chose que vous voulez est de rediriger une seule commande shell avec system à un fichier dans le système de fichiers, alors probablement le moyen le plus direct et le plus simple est de construire la commande shell pour faire cela comme

system("ls -l > Result");

Mais vous devez être prudent si le nom de fichier (Résultat) provient de l'entrée de l'utilisateur car l'utilisateur peut fournir quelque chose comme 'Result; rm -rf /*' comme nom de fichier.

De plus, en ce qui concerne la sécurité, vous devriez envisager de spécifier le chemin complet vers ls comme suggéré dans les commentaires :

system("/bin/ls -l > Result");

Le plus simple est d'utiliser > en effet :

#include <stdio.h>
int main()
{
    system("ls -l > /some/file");

    return 0;
}

Une alternative consiste à utiliser popen() , quelque chose comme

   #include <stdio.h>
   #include <stdlib.h>
   main()
   {
           char *cmd = "ls -l";
           char buf[BUFSIZ];
           FILE *ptr, *file;

           file = fopen("/some/file", "w");
           if (!file) abort();
           if ((ptr = popen(cmd, "r")) != NULL) {
                   while (fgets(buf, BUFSIZ, ptr) != NULL)
                           fprintf(file, "%s", buf);
                   pclose(ptr);
           }
           fclose(file);
           return 0;
   }

Vous devez utiliser le popen() fonction de bibliothèque et lire des morceaux de données à partir du FILE * renvoyé et écrivez-les dans le fichier de sortie de votre choix.

Référence.


Linux
  1. Comment rediriger la sortie d'un programme vers un fichier Zip ? ?

  2. Rediriger et canaliser la sortie ?

  3. Linux - À quelle fréquence le système de fichiers Proc est-il mis à jour sous Linux ?

  4. Comment rediriger la sortie vers un fichier et stdout

  5. Comment ajouter la sortie à un fichier ?

Introduction au système de fichiers Linux

Comment rediriger la sortie de la commande shell

Comment capturer la sortie d'une commande top dans un fichier sous Linux ?

Comment rediriger la sortie de la commande time vers un fichier sous Linux ?

Comment rediriger toute la sortie de spark-submit vers un fichier

Comment rediriger la sortie du programme comme son entrée