7

在这个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

4 回答 4

6

stdoutFILE *标准输出流的指针。dup2需要文件描述符,您也弄乱了参数顺序。采用

dup2(file, 1);

反而。

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

system("ls -l > Result");

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

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

system("/bin/ls -l > Result");
于 2012-06-25T12:38:21.367 回答
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;
   }
于 2012-06-25T12:40:26.097 回答
4

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

参考

于 2012-06-25T12:39:45.187 回答
0

使用dup而不是dup2. dup创建一个别名文件描述符,该值应始终是最小的可用文件描述符。

new_fd = dup(file);- 在这个语句中file可能有值3(因为stdinis 0, stdoutis1stderris 2)。new_fd也会如此4

如果要重定向stdout到文件中。然后按如下操作。

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

现在 dup 将返回 1 作为file描述符的别名,因为我们关闭stdout了所以打开的文件描述符是0,2,3并且1是最小的可用文件描述符。

如果您使用的dup2是手段,dup2(file,1);- 这样做

于 2012-06-25T13:00:39.730 回答