Способ, которым вы пользуетесь, снова закрывает fdout
, удаляя его подключение к fdout
, а затем его подключает к fdin
. Так что если fdin
и fdout
, возможно, 4 и 5, оба 4 и 5 теперь указывают на in.txt
.
Вместо того, что вы должны сделать что-то вроде
dup2(fdin, 0) // now 0 will point to the same as fdin
dup2(fdout, 1) // now 1 will point to the same as fdout
close(fdin); // as we don't need these any longer - if they are not 0 or 1! That should be checked.
close(fdout);
execvp(...);
Есть некоторые другие подводные камни, которые необходимо принять помощь, однако. Например, вы должны fork()
перед этим, если вы хотите, чтобы ваш процесс продолжал то, что он делает.
Почему этот комментарий на close()
выше? Ну, когда ваш процесс не будет fd 0 и/или 1 открыт (что было бы необычным, но не невозможным), fdin
может быть 0 или 1 и fdout
может быть 1. Эти ситуации вам нужно решать.
Еще лучше было бы
if (fdin > 0) {
dup2(fdin, 0); // now 0 will point to the same as fdin
close(fdin);
}
if (fdout > 1) { // cannot be 0!
dup2(fdout, 1) // now 1 will point to the same as fdout
close(fdout);
}
execvp(...);
[Прочитайте страницу вручную] (http://man7.org/linux/man-pages/man2/dup2.2.html)? –
Да, мой друг, поэтому я публикую здесь, потому что мне трудно понять. –