How to redirect the output of system() to a file?
stdout
is a FILE *
pointer of the standard output stream. dup2
expects file descriptor, also you've messed up the parameters order.
Use
dup2(file, 1);
instead.
On the better-way-to-do-this part. This way is bad because you probably want to restore your standard output after this system
call completes. You can do this in a variety of ways. You can dup
it somewhere and then dup2
it back (and close the dup
ped one). I personally don't like writing own cat
implementations as suggested in other answers. If the only thing you want is redirecting a single shell command with system
to a file in the filesystem, then probably the most direct and simple way is to construct the shell command to do this like
system("ls -l > Result");
But you have to be careful if filename (Result) comes from user input as user can supply something like 'Result; rm -rf /*'
as the filename.
Also, on the topic of security, you should consider specifying the full path to ls
as suggested in the comments:
system("/bin/ls -l > Result");
The simple thing is to use >
indeed:
#include <stdio.h>
int main()
{
system("ls -l > /some/file");
return 0;
}
An alternative is using popen()
, something along the lines of
#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;
}
You should use the popen()
library function and read chunks of data from the returned FILE *
and write them to whatever output file you like.
Reference.