如何将system()的输出重定向到文件?

Eig*_*ght 6 c linux stdout system dup

在这个C计划中

#include <stdio.h>
#include <fcntl.h>
int main()
{
    int file = open("Result", O_CREAT|O_WRONLY, S_IRWXU);

    dup2(stdout, file);
    system("ls -l");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将system()的输出重定向到一个文件,因为我已经使用了dup2但它无法正常工作.

这段代码出了什么问题
如果有更好的方法可以告诉我吗?(不在>终端使用)

unk*_*ulu 6

stdoutFILE *标准输出流的指针.dup2期待文件描述符,你也搞砸了参数顺序.使用

dup2(file, 1);
Run Code Online (Sandbox Code Playgroud)

代替.

在更好的方式做这部分.这种方式很糟糕,因为您可能希望在此system调用完成后恢复标准输出.您可以通过多种方式执行此操作.你可以dup在某个地方然后dup2它回来(并关闭dup一个).我个人不喜欢像cat其他答案中所建议的那样编写自己的实现.如果您唯一想要的是将单个shell命令重定向system到文件系统中的文件,则可能最直接和最简单的方法是构造shell命令来执行此操作

system("ls -l > Result");
Run Code Online (Sandbox Code Playgroud)

但是如果文件名(结果)来自用户输入,则必须要小心,因为用户可以提供类似'Result; rm -rf /*'文件名的内容.

此外,关于安全性主题,您应该考虑ls在注释中指定完整路径:

system("/bin/ls -l > Result");
Run Code Online (Sandbox Code Playgroud)


joh*_*nes 5

简单的事情是>确实使用:

#include <stdio.h>
int main()
{
    system("ls -l > /some/file");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用popen(),类似的东西

   #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;
   }
Run Code Online (Sandbox Code Playgroud)