Используйте dup2, чтобы заменить стандартный вывод файловым дескриптором и вернуться обратно

Вот код:

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 »нигде не найдено.

3

Решение

Все, что вам нужно сделать, это изменить последний dup2() от:

dup2(output, stdoutBack);

чтобы …

dup2(stdoutBack, 1);

Что вам действительно нужно сделать, это скопировать вашу резервную копию старого stdout обратно в дескриптор файла stdout (1), а не изменять вашу резервную копию (которая находится на другом дескрипторе), чтобы ссылаться на файл (что вы сейчас делаете ).

После этого вы можете закрыть stdoutBack, Кроме того, нет необходимости явно закрывать стандартный вывод dup2(), поскольку dup2() будет делать это в любом случае, если он все еще открыт.

4

Другие решения


По вопросам рекламы [email protected]