ошибка потоков и llvm - PullRequest
       25

ошибка потоков и llvm

2 голосов
/ 16 октября 2011

Вот код функции:

int getStream()
    {
           int fd = _dup(fileno(stdout));
           freopen("tmp","w",stdout);
           return fd;
    }


void freeStream(int fd)
{
       _dup2(fd,fileno(stdout));
       close(fd);
}

код основной программы:

printf(“start tets”);
int fd = getStream();
printf(“redirection”);
freeStream(fd);

Это часть большой программы, которая использует llvm Проблема, которую я получаю после freeStream(fd): LLVM ERROR: IO failure on output stream. Я понимаю, что проблема с реализацией freeStream. Как вы думаете? Спасибо

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Если вы хотите надежно увидеть текст "redirection" в конечном итоге во временном файле, вам нужно очистить буфер в stdout, прежде чем закрыть его, чтобы избавиться от любых ожидающих записей, которые буферизуются в потоке,Для этого добавьте эту строку в вашу freeStream функцию:

void freeStream(int fd)
{
   fflush(stdout); //<== add this line
   _dup2(fd,fileno(stdout));
   close(fd);
}
2 голосов
/ 16 октября 2011

Как диагностировал Джейсон, вам нужно fflush() поток (stdout), прежде чем закрыть базовый файл (с помощью вызова _dup2()).

Другая проблема заключается в том, что нет проверки ошибокв коде;Вы не знаете, какие из ваших вызовов функций, если таковые вообще имеются, терпят неудачу.По крайней мере, при решении этой проблемы вам необходимо отслеживать как freopen(), так и _dup2(), чтобы убедиться, что они работают.

Не ясно, что в Windows вы можете добраться до задней части библиотеки <stdio.h>и измените дескриптор файла.В Unix, я думаю, это будет работать - не обязательно поддерживается, но, вероятно, это будет работать.Но я легко могу представить себе, как это не работает в Windows (не будучи уверенным, что мое воображение не просто оживляет).

В конечном счете, я не уверен, что есть портативный способ восстановить stdout обратно в исходное состояние.вывод после использования freopen() на нем.

...