In this C program
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int file = open("Result", O_CREAT|O_WRONLY, S_IRWXU);
dup2(stdout, file);
system("ls -l");
return 0;
}
I’m trying to redirect the output of system() to a file, for that i have used dup2 but it is not working.
What’s wrong with this code?
and, please tell me if there is any better way to do this? (without using > at the terminal )
stdoutis aFILE *pointer of the standard output stream.dup2expects file descriptor, also you’ve messed up the parameters order.Use
instead.
On the better-way-to-do-this part. This way is bad because you probably want to restore your standard output after this
systemcall completes. You can do this in a variety of ways. You candupit somewhere and thendup2it back (and close thedupped one). I personally don’t like writing owncatimplementations as suggested in other answers. If the only thing you want is redirecting a single shell command withsystemto a file in the filesystem, then probably the most direct and simple way is to construct the shell command to do this likeBut 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
lsas suggested in the comments: