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.