2014-01-14 1 views
3

내가 버퍼에 대해 이해 한 바로는 : 버퍼는 일시적으로 저장된 데이터입니다.쓰기 버퍼링 된 데이터를 fflush (stdout)없이 파일에 블로킹

예를 들어, 무언가가 음성인지 잡음인지를 결정하는 알고리즘을 구현한다고 가정 해 보겠습니다. 사운드 데이터의 지속적인 스트림 흐름을 사용하면 어떻게 할 수 있을까요? 그것은 매우 어려울 것입니다. 따라서 이것을 배열에 저장함으로써이 데이터에 대한 분석을 수행 할 수 있습니다.

이 데이터 배열을 버퍼라고합니다. 내가 파일에이 명령의 출력을 작성한다면

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)}' < /dev/ttyUSB0 

, 내가 그것을 쓸 수 없을 것입니다 때문에, 상기 출력이 연속입니다 이제

, 나는 리눅스 명령을 출력은 아마도 블록 버퍼이며 위의 명령의 출력을 종료하면 빈 텍스트 파일 만 생성됩니다 (Ctrl + C).

다음은 Block Buffered의 의미입니다. 가능한 버퍼링

세 종류
버퍼링 및 라인 버퍼 블록 버퍼링한다. 출력 스트림이 버퍼링되지 않으면 정보가 쓰여지는 즉시 대상 파일이나 터미널에 정보가 나타납니다. 블록 버퍼링되면 많은 문자가 저장되고 이 블록으로 기록됩니다. 줄 바꿈 될 때 줄 바꿈 문자는 줄 바꿈이 출력되거나 터미널 장치 (일반적으로 stdin)에 연결된 모든 스트림 에서 입력이 읽힐 때까지 최대 까지 저장됩니다. 함수 fflush (3)를 사용하여 블록을 조기에 강제 종료 할 수 있습니다. 자세한 내용은 fclose (3)을 참조하십시오. 일반적으로 모든 파일은 블록 버퍼링됩니다. 파일에서 첫 번째 I/O 연산이 발생하면 malloc (3)이 호출되고 버퍼
이 얻어집니다. 스트림이 터미널을 참조하는 경우 (보통 stdout이 인 경우처럼) 버퍼가 버퍼링됩니다. 표준 오류 스트림 stderr은 기본적으로 항상 버퍼링되지 않고 입니다.

자,이 명령을 실행, 내가 프로세스가 종료 할 때 버퍼 블록이 완료되지 않은 수 있기 때문에

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)}' </dev/ttyUSB0> outputfile.txt 

빈 파일이 생성되며, 난 블록 버퍼를 알 수 없기 때문에 크기, 블록이 완료 될 때까지 기다릴 방법이 없습니다.

이 명령의 출력을 파일에 쓰려면 fflush()awk 안에 넣어야합니다. 그러면 성공적으로 이미 완료 한 텍스트 파일에 출력이 성공적으로 기록됩니다.

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/GGA/ {print "Latitude:",$3,$4,"Longitude:",$5,$6,"Altitude:",$10,$11,"Time:",substr($2+50000,1,2),".",substr($2,3,2),".",substr($2,5,2); fflush(stdout) }' < /dev/ttyUSB0 | head -n 2 > GPS_data.txt 

하지만 내 질문은 : 여기

이 간다

내가의 버퍼 블록이 생성 된시기를 알 것이다 그래야 버퍼 블록 크기를 선언 할 수있는 방법이 있는가, 그래서 제거 fflush()을 사용할 필요가 있습니까?

OR

블록을 버퍼링 또는 라인 버퍼에서 버퍼링 버퍼 유형을 변경 어쨌든 있는가?

+0

질문을 이해하지 못하지만 사용자 정의 구조체 및 함수를 작성하여 현재 버퍼 데이터 크기와 같이 필요한 정보를 기록 할 수 있습니다. – moeCake

+1

당신의 질문에 대한 설명 buffer concept .. :) –

+0

bash는'GPS_data.txt' 자체에'fclose'를 호출합니다. 그 자체가 세그먼트 화와 같은 신호로 끝나지 않는 한 명령이 종료되면 버퍼를'fflush '합니다. 잘못 또는 기타. 즉, 단순히'cmd> file'을 실행하고'file'가 쓰여지지 않는다면 ('cmd'가 실제로 출력을 생성하는 동안),'cmd'에 잘못된 것이 있습니다. – Shahbaz

답변

3

stdbuf을 사용하여 수정 된 버퍼 크기로 명령을 실행할 수 있습니다.

예를 들어 stdbuf -o 100 awk ...은 100 바이트 표준 출력 버퍼로 awk을 실행합니다.

+2

'stdbuf -o1000 -awk ...'트릭을해야합니다. – Alfe

+1

@Xufyan 예제를 추가했습니다. –

관련 문제