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但它无法正常工作.
这段代码出了什么问题?
如果有更好的方法可以告诉我吗?(不在>
终端使用)
stdout
是FILE *
标准输出流的指针.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)
简单的事情是>
确实使用:
#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)