Re[4]: Прямое перенаправления stdout в stdin
От: 0xff  
Дата: 13.08.07 16:16
Оценка: 27 (1)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, 0xff, Вы писали:


К>Было бы проще не заморачивать себе голову, а завести ещё один глобальный поток, и дублировать туда дескриптор либо трубки, либо стдаута.

К>Грубо говоря,
К>
К>// ...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");
К>


Я для себя только что нашел более удобный способ. Можно переопределить stdin и stdout через freopen(), указав, какой-нибудь временный файл, а dup2() закроет его сам. Дескрипторы конечно будут не 0 и 1, но зато printf() будет работать без проблем. Единственное, что временный файл надо удалить будет потом. В общем, код теперь примерно такой

    f = freopen("tmp.tmp","wb",stdout);
    f = freopen("tmp.tmp","rb",stdin);

    setvbuf(stdout,NULL,_IONBF,0);

...
    int pipe_fd[2] = {-1};

    if(_pipe(pipe_fd,1024,_O_BINARY) == -1){
        perror("_pipe()");
    }else{
        if(dup2(pipe_fd[0],_fileno(stdin)) == -1)
            perror("dup2(pipe_fd[0],_fileno(stdin))");
        if(dup2(pipe_fd[1],_fileno(stdout)) == -1)
            perror("dup2(pipe_fd[1],_fileno(stdout))");
    }

...

    printf("Test printf()\n");

...
    char tmp[1024] = {0};
    gets(tmp);
    // теперь tmp == "Test printf()"


Спасибо, за помощь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.