How to redirect the output of system() to a file?

后端 未结 4 1272
忘了有多久
忘了有多久 2021-01-02 21:34

In this C program

#include 
#include 
int main()
{
    int file = open(\"Result\", O_CREAT|O_WRONLY, S_IRWXU);

         


        
相关标签:
4条回答
  • 2021-01-02 22:22

    use dup instead of dup2. dup creates a alias file descriptor, which value should be always the smallest available file descriptor.

    new_fd = dup(file); - In this statement file might be having the value 3 (because stdin is 0, stdout is 1 and stderr is 2). so new_fd will be 4

    If you want to redirect stdout into file. Then do as below.

    close(stdout);
    new_fd = dup(file);
    

    Now dup will return 1 as the alias for the file descriptor, because we closed stdout so opened file descriptors are 0,2,3 and 1 is smallest available file descriptor.

    If you are using dup2 means, dup2(file,1); - do like this

    0 讨论(0)
  • 2021-01-02 22:24

    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;
       }
    
    0 讨论(0)
  • 2021-01-02 22:36

    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.

    0 讨论(0)
  • 2021-01-02 22:38

    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 dupped 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");
    
    0 讨论(0)
提交回复
热议问题