windows8 - _dup, _dup2 - PullRequest
       63

windows8 - _dup, _dup2

3 голосов
/ 02 апреля 2012

Я использую 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 случайное число правильных «redirect j» печатных изданий: после него файл остается пустым для оставшихся выполнений. (Указатель f никогда не равен NULL в acquOutputStream) «test j»всегда печатается правильно.В чем может быть проблема?Это известная проблема на win 8?

1 Ответ

0 голосов
/ 11 апреля 2012

Есть одна маленькая проблема, которую я вижу с вашим кодом.

static void releaseOutputStream(int fd)

{   fflush(stdout);
    streamDup2(fd,fileno(stdout));
    close(fd);
}

В этой функции вы не закрываете стандартный вывод до вызова dup2 (fclose (стандартный вывод)).

Пожалуйста, добавьте больше деталей к вопросу о том, что именно вы видите при запуске этого кода. Это поможет в диагностике проблемы.

...