stdout
è un FILE *
puntatore del flusso di output standard. dup2
si aspetta un descrittore di file, inoltre hai incasinato l'ordine dei parametri.Usa
dup2(file, 1);
invece.
Nel modo migliore per fare questa parte. In questo modo non va bene perché probabilmente vorrai ripristinare il tuo output standard dopo questo system
chiamata completata. Puoi farlo in vari modi. Puoi dup
da qualche parte e poi dup2
indietro (e chiudi il file dup
ped uno). Personalmente non mi piace scrivere proprio cat
implementazioni come suggerito in altre risposte. Se l'unica cosa che vuoi è reindirizzare un singolo comando di shell con system
a un file nel filesystem, allora probabilmente il modo più diretto e semplice è costruire il comando shell per fare questo come
system("ls -l > Result");
Ma devi stare attento se il nome file (Risultato) proviene dall'input dell'utente poiché l'utente può fornire qualcosa come 'Result; rm -rf /*'
come nome file.
Inoltre, per quanto riguarda la sicurezza, dovresti considerare di specificare il percorso completo di ls
come suggerito nei commenti:
system("/bin/ls -l > Result");
La cosa semplice è usare >
anzi:
#include <stdio.h>
int main()
{
system("ls -l > /some/file");
return 0;
}
Un'alternativa è usare popen()
, qualcosa sulla falsariga di
#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;
}
Dovresti usare il popen()
library e leggere blocchi di dati dal FILE *
restituito e scriverli in qualsiasi file di output che ti piace.
Riferimento.