【发布时间】:2017-11-24 18:21:25
【问题描述】:
我正在尝试制作ls | tr a b > text.txt
我已经完成了管道,但我无法将 STDOUT 添加到管道的末尾(在我的情况下,STDOUT 只能在最后一个参数中)
我标记了代码中应该做重定向的部分,我认为应该打开那个文件,并使用dup2方法,但我不知道以哪种方式
方法包含管道 -
enum reqType { PIPE, STDOUT };
int spawn_proc (int in, int out, char** cmd) {
pid_t pid;
if ((pid = fork ()) == 0) {
if (in != 0) {
dup2 (in, 0);
close (in);
}
if (out != 1) {
dup2 (out, 1);
close (out);
}
return execvp (cmd[0], cmd);
}
return pid;
}
void fork_pipes (int n, char** cmd[], enum reqType type) {
int i;
pid_t pid;
int in, fd [2];
in = 0;
for (i = 0; i < n - 1; ++i) {
if(type == PIPE || i < n-2) {
pipe (fd);
spawn_proc (in, fd [1], cmd[i]);
close (fd [1]);
in = fd [0];
}
else if(type == STDOUT && i == n-2) {
///HOW TO IMPLEMENT THIS PART?
}
}
if (in != 0)
dup2 (in, 0);
execvp (cmd[i][0], cmd[i]);
}
编辑 在标记为 /// 我写的地方
pipe(fd);
int out = open(cmd[n-1][0],O_WRONLY|O_CREAT|O_TRUNC);
spawn_proc(in, out, cmd[i]);
close(fd[1]);
【问题讨论】:
-
使用
open获取重定向文件的文件描述符并通过管道传输到该文件。我会在传递命令之前处理重定向,您可能需要检查 shell 上 strace 的输出,看看它是如何处理这个的 -
请看问题的编辑部分,那里有一些地方需要改变
-
我认为
spawn_proc(in, out, cmd[i])中的in应该改为fd[0],即:管道的读取端。 -
但是在之前的交互中有
in = fd[0]所以这完全一样 -
您不需要管道进行重定向,它应该从先前的管道读取端读取。只需将文件描述符从
open复制到标准输出即可。您可能希望为您的公开通话添加权限,例如。 0666.
标签: c shell unix pipe io-redirection