增加标准输出缓冲区大小

时间:2013-08-14 22:11:57

标签: c linux buffer

我正在运行一个启动进程的程序,然后该进程写入我的程序使用的stdout。问题是,我需要的输出大约是42000字节。似乎stdout缓冲区大小是8192,我不希望它刷新,直到它达到42000.有没有办法设置这个?

我试过了:

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

关于子进程的代码,但它似乎根本不起作用。有没有人有任何想法?

3 个答案:

答案 0 :(得分:5)

您需要提供一个缓冲区setvbuf()才能正常工作。

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

来自man page

  

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字节的单次写入。

答案 1 :(得分: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);

你还必须关闭stdout,因为man setvbuff也提到:

  

您必须确保buf指向的空间仍然存在      时间流已关闭,也会在程序终止时发生。

答案 2 :(得分:0)

检查ulimit的手册页,还是那样,太天真了?因为我非常确定操作系统将用户数量限制为8k。

希望您不需要新内核!!