stdout
adalah FILE *
penunjuk aliran keluaran standar. dup2
mengharapkan deskriptor file, Anda juga telah mengacaukan urutan parameter.Gunakan
dup2(file, 1);
sebagai gantinya.
Pada bagian cara yang lebih baik untuk melakukan ini. Cara ini buruk karena Anda mungkin ingin mengembalikan keluaran standar Anda setelah system
ini panggilan selesai. Anda dapat melakukan ini dengan berbagai cara. Anda dapat dup
di suatu tempat dan kemudian dup2
kembali (dan tutup dup
ped satu). Saya pribadi tidak suka menulis cat
sendiri implementasi seperti yang disarankan dalam jawaban lain. Jika satu-satunya hal yang Anda inginkan adalah mengarahkan ulang satu perintah shell dengan system
ke file di sistem file, maka mungkin cara yang paling langsung dan sederhana adalah membuat perintah shell untuk melakukannya seperti ini
system("ls -l > Result");
Tetapi Anda harus berhati-hati jika nama file (Hasil) berasal dari input pengguna karena pengguna dapat memberikan sesuatu seperti 'Result; rm -rf /*'
sebagai nama file.
Selain itu, pada topik keamanan, Anda harus mempertimbangkan untuk menentukan jalur lengkap ke ls
seperti yang disarankan di komentar:
system("/bin/ls -l > Result");
Hal yang sederhana adalah dengan menggunakan >
memang:
#include <stdio.h>
int main()
{
system("ls -l > /some/file");
return 0;
}
Alternatifnya menggunakan popen()
, sesuatu yang sejalan dengan
#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;
}
Anda harus menggunakan popen()
fungsi perpustakaan dan membaca potongan data dari FILE *
yang dikembalikan dan tulis ke file keluaran apa pun yang Anda suka.
Referensi.