如何在C中正确执行多重重定向

问题描述 投票:-1回答:1

我对多个重定向有疑问。正如我现在所写的那样,仅写在file1.txt中。我必须在我的shell上实现echo hello > file1.txt > file2.txt > file3.txt

这是我的代码:

int fd1 = open(file1.txt, O_RDWR);
int fd2 = open(file2.txt, O_RDWR);
int fd3 = open(file3, O_RDWR);

dup2(fd1,1);    //to redirect fd1 on the stdout
dup2(fd2,fd1);  //to redirect fd2 to fd1 so i can read from fd1
dup2(fd3,fd1);  //to redirect fd3 to fd1 so i can read from fd1

char* arr = {"hello"};
execvp("echo",arr);

但是以上代码仅在第一次重定向中有效。其余的fd2和fd3不会根据需要重定向。感谢所有帮助!谢谢

编辑:预期结果将是file1.txtfile2.txtfile3.txt包含单词“ hello”。

c linux file-descriptor dup2 dup
1个回答
0
投票

在经典的Unix流程模型中没有直接的方法可以做到这一点。

stdout只能指向一个位置,这就是为什么在大多数shell(bash,dash,ksh,busybox sh)中,echo hello > file1.txt > file2.txt > file3.txt只会写入file3.txt的原因。

在这些shell中,您必须运行:

echo hello | tee file1.txt file2.txt file3.txt > /dev/null

Zsh是唯一会写入所有三个文件的shell,它通过像上面一样实现自己的tee来实现(通过将stdout设置为管道,并分叉从该管道读取并写入的进程)多个文件)。您可以执行相同操作。

© www.soinside.com 2019 - 2024. All rights reserved.