2

プロセスを開始するプログラムを実行しています。そのプロセスは、プログラムが使用する stdout に書き込みます。問題は、必要な出力が約 42000 バイトであることです。stdout バッファ サイズが 8192 のようで、42000 になるまでフラッシュしたくありません。これを設定する方法はありますか?

私はこれを試しました:

setvbuf ( stdout , NULL , _IOFBF , 50000 ); // ie set it to 50000 bytes

サブプロセスのコードについてですが、まったく機能していないようです。誰にもアイデアはありますか?

4

3 に答える 3

5

動作させるにはバッファを提供する必要がありますsetvbuf()

static char buf[50000]; /* buf must survive until stdout is closed */
setvbuf ( stdout , buf , _IOFBF , sizeof(buf) );

マニュアルページから:

int setvbuf(FILE *stream, char *buf, int mode , size_t size);
...バッファリングされ
ていないファイルを除いて、buf引数は少なくともsizeバイト長のバッファを指す必要があります。このバッファは、現在のバッファの代わりに使用されます。 引数bufが NULL の場合、モードのみが影響を受けます。次の読み取りまたは書き込み操作で新しいバッファが割り当てられます。

サンプルプログラムは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv[]) {
    char msg[42000];
    char buf[50000];

    setvbuf(stdout, buf, _IOFBF, sizeof(buf));
    memset(msg, 'a', sizeof(msg));
    msg[sizeof(msg)-1] = '\0';
    puts(msg);
    exit(0);
}

私のシステムでは、出力はバイトstraceの単一書き込みを示しています。42000

于 2013-08-14T22:24:49.280 に答える
2

jxh回答への追加情報として:

char buf[50000];
setvbuf ( stdout , buf , _IOFBF , sizeof(buf) );
/*close stdout before the programs finishes or even before buf goes out of scope*/
fclose(stdout);

man setvbuff も言及しているため、標準出力も閉じる必要があります。

ストリームが閉じられるまでに buf が指す領域がまだ存在していることを確認する必要があります。これは、プログラムの終了時にも発生します。

于 2013-08-14T23:10:22.260 に答える