3

プログラムを実行するために 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);
}

私がそれを実行するたびに、正しい「リダイレクトj」印刷のtmp乱数をファイルに出力します。その後、残りの実行ではファイルは空になります。(acquireOutputStreamでfポインターがNULLになることはありません)正しく。何が問題になる可能性がありますか?win8の既知の問題ですか?

4

1 に答える 1

0

私があなたのコードで見る1つの小さな問題があります。

static void releaseOutputStream(int fd)

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

この関数では、dup2呼び出し(fclose(stdout))の前にstdoutを閉じません。

このコードを実行したときに表示される内容について、質問に詳細を追加してください。問題の診断に役立ちます。

于 2012-04-10T20:50:35.657 に答える