我C编码的一个基本的壳,用于执行基本命令它会执行命令ls,ls -al,ls -al | more等.
我想在我的shell中执行以下命令.喜欢 ;
ls -al > a.txt
Run Code Online (Sandbox Code Playgroud)
这将给我a.txt包含ls -al进程输出的文件.我找到了一个解决方案,它正在改变我的shell中的命令[command1] | tee [filename].在这种情况下,它将ls -al > a.txt改为ls -al | tee a.txt.但是这个过程也将输出提供给文件和终端.如何在终端中停止打印输出.
或者是否有更好的解决方案而不是使用tee命令.提前致谢...
seh*_*ehe 11
这是我用dup2测试的结果
更微妙的一点是在正确的时间记住fflush :)否则,你会得到非常令人惊讶的结果.
此外,更喜欢fileno而不是硬编码1(stdout)2(stderr).
重定向stdin留给读者作为练习
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
int out = open("cout.log", O_RDWR|O_CREAT|O_APPEND, 0600);
if (-1 == out) { perror("opening cout.log"); return 255; }
int err = open("cerr.log", O_RDWR|O_CREAT|O_APPEND, 0600);
if (-1 == err) { perror("opening cerr.log"); return 255; }
int save_out = dup(fileno(stdout));
int save_err = dup(fileno(stderr));
if (-1 == dup2(out, fileno(stdout))) { perror("cannot redirect stdout"); return 255; }
if (-1 == dup2(err, fileno(stderr))) { perror("cannot redirect stderr"); return 255; }
puts("doing an ls or something now");
fflush(stdout); close(out);
fflush(stderr); close(err);
dup2(save_out, fileno(stdout));
dup2(save_err, fileno(stderr));
close(save_out);
close(save_err);
puts("back to normal output");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当输出要发送到文件时,不要使用管道。
当您分叉子进程来运行ls命令时,您会记下重定向并打开文件;然后使用dup2()(或close()和dup()) 使文件描述符现在成为子级的标准输出;您关闭重复的文件描述符 - 由open();返回的文件描述符 然后你ls照常执行;它的标准输出现在被发送到文件。
请注意,非管道 I/O 重定向是在分叉之后而不是之前执行的。必须在分叉之前设置管道,但其他 I/O 重定向则不需要。
| 归档时间: |
|
| 查看次数: |
33153 次 |
| 最近记录: |