2013-08-14 4 views
2

Я запускаю программу, которая запускает процесс, а затем этот процесс записывает в stdout, который использует моя программа. Проблема в том, что мне нужен результат около 42000 байт. Кажется, размер буфера stdout составляет 8192, и я не хочу, чтобы он закрашивался до тех пор, пока он не достигнет 42000. Есть ли способ установить это?увеличение стандартного размера буфера вывода

Я попытался это:

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

на код для подпроцесса, но это, кажется, не работает. У кого-нибудь есть идеи?

+0

Обратите внимание, что 'setvbuf()' необходимо называть _before_ первой операцией, которая записывает в буфер; после этого вызов 'setvbuf()' не имеет никакого эффекта. –

+0

@JonathanLeffler: Нет, после этого у него неопределенное поведение. Это может привести к повреждению файла или сбою всей программы (или компьютера). –

ответ

3

Вам необходимо предоставить буфер для работы 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 байт.

+0

Это не работает. Возвращаемые данные по-прежнему остаются 8192. Возможно, это стандартный ввод родительского процесса. – user1276273

+0

Выполняете ли вы какие-либо другие операции ввода-вывода перед вызовом 'setvbuf()'? – jxh

+0

Да, у меня есть стандартный ввод, то есть: fgets (параметры, 2000, stdin); – user1276273

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); 

вам придется закрыть стандартный вывод Aswell, потому что человек setvbuff также упоминает:

Вы должны убедиться в том, что пространство, которое ЬиЕ указывает на еще существует на поток времени закрыт, что также происходит при завершении программы.

+0

Это действительно мог быть комментарий к моему ответу, но +1 в любом случае. – jxh

+0

Вызов 'exit' вместо возврата из' main' гарантирует, что время жизни 'buf' не заканчивается до выхода программы. –

0

Просмотрите страницу man для ulimit или это, как, путь слишком наивен ?? Потому что я уверен, что ОС ограничивает пользователя fifos до 8k.

Надеюсь, вам не понадобится новое ядро!

Смежные вопросы