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

时间:2012-06-25 12:34:00

标签: c linux system stdout 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;
}

我正在尝试将system()的输出重定向到一个文件,因为我使用了dup2但它无效。

此代码有什么问题
并且,请告诉我是否有更好的方法来做到这一点? (不在终端使用>

4 个答案:

答案 0 :(得分:6)

stdout是标准输出流的FILE *指针。 dup2期望文件描述符,你也搞砸了参数顺序。 使用

dup2(file, 1);

代替。

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

system("ls -l > Result");

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

此外,关于安全性主题,您应该考虑按照评论中的建议指定ls的完整路径:

system("/bin/ls -l > Result");

答案 1 :(得分:5)

简单的事情是确实使用>

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

    return 0;
}

另一种方法是使用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;
   }

答案 2 :(得分:4)

您应该使用popen()库函数并从返回的FILE *中读取数据块,并将它们写入您喜欢的任何输出文件。

Reference

答案 3 :(得分:0)

使用dup代替dup2dup创建别名文件描述符,该值应始终是最小的可用文件描述符。

new_fd = dup(file); - 在此声明中file可能具有值3(因为stdin0stdout是{{1} }和1stderr)。因此2将为new_fd

如果要将4重定向到文件中。然后按以下步骤操作。

stdout

现在dup将返回1作为close(stdout); new_fd = dup(file); 描述符的别名,因为我们关闭了file所以打开的文件描述符是stdout0,2,3是最小的可用文件描述符。

如果您使用1表示dup2 - 请执行此操作