2

我正在运行一个程序,它启动一个进程,然后该进程写入我的程序使用的标准输出。问题是,我需要的输出大约是 42000 字节。似乎标准输出缓冲区大小是 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 回答
0

检查手册页,ulimit或者是不是太天真了?因为我很确定操作系统将用户 fifos 限制为 8k。

希望您不需要新内核!

于 2013-08-15T07:18:50.227 回答