Вот код:
int main()
{
std::cout << "In stdout" << std::endl;
int stdoutBack = dup(1);
close(1);
int output = open("buffer.txt", O_RDWR|O_CREAT|O_APPEND, 0777);
dup2(output, 1);
std::cout << "In buffer" << std::endl;
dup2(output, stdoutBack);
close(output);
std::cout << "In stdout" << std::endl;
}
Я хотел бы, чтобы «In stdout» печатался в stdout, «In buffer» печатался в buffer.txt, а затем «In stdout» снова печатался в stdout.
Что на самом деле происходит в приведенном выше коде: «In stdout» печатается в stdout, «In buffer» печатается в buffer.txt », но последнее сообщение« In stdout »нигде не найдено.
Все, что вам нужно сделать, это изменить последний dup2()
от:
dup2(output, stdoutBack);
чтобы …
dup2(stdoutBack, 1);
Что вам действительно нужно сделать, это скопировать вашу резервную копию старого stdout обратно в дескриптор файла stdout (1), а не изменять вашу резервную копию (которая находится на другом дескрипторе), чтобы ссылаться на файл (что вы сейчас делаете ).
После этого вы можете закрыть stdoutBack
, Кроме того, нет необходимости явно закрывать стандартный вывод dup2()
, поскольку dup2()
будет делать это в любом случае, если он все еще открыт.