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.