Здравствуйте, 0xff, Вы писали:
0>В общем, век живи, век RTFM... Получается, что с одной стороны stdout всегда есть и ссылается на дескриптор 1, а с другой стороны, только в случае если была создана консоль...
Получается, что с помощью _dup2(...,1),
— когда у тебя есть консоль (и stdout сидит на 1), ты его переназначаешь,
— а когда его нет — то ты создаёшь новый дескриптор.
Вот и вся история.
0>Короче говоря, теперь возник вопрос, как заново ассоциировать stdout и stdin с дескрипторами 1 и 0? Или единственный выход создавать консоль и прятать ее потом каким-то образом?
Было бы проще не заморачивать себе голову, а завести ещё один глобальный поток, и дублировать туда дескриптор либо трубки, либо стдаута.
Грубо говоря,
// ...h
extern FILE* myout;
....
// ...cpp
FILE* myout;
....
if( use_pipe || _fileno(stdout)<0 )
{
int fds[2] = {0,0};
_pipe(fds, 1024, _O_BINARY);
myout = _fdopen(fds[1], "w");
}
else
myout = _fdopen(_fileno(stdout));
....
///// использование
fprintf(myout, "hello, %s", "world");
... << RSDN@Home 1.2.0 alpha rev. 655>>