windows8 - _dup,_dup2
Я использую Win8 Consumer preview build 8250 для выполнения программы, которая нормально работает на win7. В программе используются следующие макросы / функции:
#if defined(_WIN32)
#include <io.h>
#define streamDup(fd1) _dup(fd1)
#define streamDup2(fd1,fd2) _dup2(fd1,fd2)
#endif
static int acquireOutputStream()
{ int fd = streamDup(fileno(stdout));
FILE* f = freopen("tmp","w",stdout);
return fd; }
static void releaseOutputStream(int fd)
{ fflush(stdout);
streamDup2(fd,fileno(stdout));
close(fd);
}
Программа выполняет следующее:
for (int i = 0; i < 1000;++i) {
int fd = acquireOutputStream();
printf("redirect %d\n",i);
releaseOutputStream(fd);
printf("test %d\n",i);
}
Каждый раз, когда я запускаю его, он печатает в файл tmp случайное число правильных "перенаправлений j": после него файл пуст для оставшихся выполнений (указатель f никогда не равен NULL в acquOutputStream)"test j" всегда печатается правильно. В чем может быть проблема? Это известная проблема на win 8?
1 ответ
Есть одна небольшая проблема, которую я вижу с вашим кодом.
static void releaseOutputStream(int fd)
{ fflush(stdout);
streamDup2(fd,fileno(stdout));
close(fd);
}
В этой функции вы не закрываете стандартный вывод до вызова dup2 (fclose(стандартный вывод)).
Пожалуйста, добавьте больше деталей к вопросу о том, что именно вы видите при запуске этого кода. Это поможет в диагностике проблемы.