Как правильно выполнить множественное перенаправление в C - PullRequest
0 голосов
/ 26 марта 2020

У меня вопрос по поводу нескольких перенаправлений. Как то, что я сейчас пишу только в file1.txt. Я должен реализовать 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.txt , file2.txt и file3.txt будет содержать слово " привет».

1 Ответ

1 голос
/ 26 марта 2020

Нет прямого способа сделать это в модели процессов classi c Unix.

stdout может указывать только на одно местоположение, поэтому echo hello > file1.txt > file2.txt > file3.txt будет записывать только в file3.txt в большинстве оболочек (bash, да sh, k sh, busybox sh).

В этих оболочках вместо этого вам нужно выполнить:

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

Zsh - единственная оболочка, которая записывает во все три файла, и делает это путем реализации своего собственного tee, как и выше (установив stdout в канал и разветвив процесс для чтения из канала и записи в несколько файлы). Вы можете сделать то же самое.

...