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)
| 归档时间: |
|
| 查看次数: |
24740 次 |
| 最近记录: |