Re[3]: Прямое перенаправления stdout в stdin
От: Кодт Россия  
Дата: 13.08.07 15:41
Оценка:
Здравствуйте, 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>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.