2013-08-14 5 views
2

프로세스를 시작하는 프로그램을 실행 중이며 프로세스가 내 프로그램에서 사용하는 stdout에 씁니다. 문제는 약 42000 바이트의 출력이 필요하다는 것입니다. stdout 버퍼 크기가 8192 인 것 같아서 42000에 도달 할 때까지 플러시하지 않으려 고합니다. 이것을 설정하는 방법이 있습니까? 서브 프로세스의 코드에표준 출력 버퍼 크기가 증가합니다.

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

하지만 전혀 작동하지 않는 것 :

나는이 시도. 누구든지 아이디어가 있습니까?

+0

'setvbuf()'는 버퍼에 쓰는 첫 번째 작업 이전에 호출되어야한다는 것에주의하십시오. 이후'setvbuf()'호출은 아무 효과가 없다. –

+0

@JonathanLeffler : 아니요, 나중에 정의되지 않은 동작이 있습니다. 파일이 손상되거나 전체 프로그램 (또는 컴퓨터)이 폭파 될 수 있습니다. –

답변

3

작동하려면 버퍼를 setvbuf()에 제공해야합니다. man page에서

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 바이트의 단일 쓰기를 보여줍니다 여기에

은 샘플 프로그램입니다.

+0

이것은 작동하지 않습니다. 돌아 오는 데이터는 여전히 8192입니다. 아마도 부모 프로세스의 표준 입력입니다. – user1276273

+0

'setvbuf()'를 호출하기 전에 다른 I/O 연산을 수행합니까? – jxh

+0

예, 표준 입력이 있습니다 : 즉 : fgets (parameters, 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); 

당신이 남자 setvbuff도 언급하기 때문에 표준 출력의 aswell을 종료해야합니다 :

당신은 확인해야합니다 그 여전히 가리키는 버피 공간이 에 의해 존재하며, 프로그램 종료시에도 발생하는 시간 흐름이 닫힙니다.

+0

이것은 정말로 나의 대답에 대한 코멘트 일 수 있었지만 어쨌든 +1했다. – jxh

+0

'main'에서 돌아 오는 대신'exit'를 호출하면 프로그램이 종료되기 전에'buf'의 수명이 끝나지 않습니다. –

0

ulimit에 대한 매뉴얼 페이지를 확인하거나, 그렇게 순진한 방법입니까? 왜냐하면 OS가 사용자 FIFO를 8k로 제한한다는 것이 확실하기 때문입니다.

새로운 커널이 필요하지 않기를 바랍니다 !!