아니요, 거기는 아닙니다.

아니요, 거기는 아닙니다.

표준 입력 리디렉션을 사용하여 프로그램을 실행하고 있습니다.

 $ prog < f

이 경우 표준 입력은 완전히 버퍼링됩니다.

버퍼링되지 않거나 라인 버퍼링되도록 만드는 방법이 있습니까?

편집하다.

프로그램 소스 코드를 수정할 필요가 없습니다(즉, setvbuf() 사용).

답변1

버퍼링 없음일반적으로 출력에 더 적합합니다. 출력 버퍼링은 애플리케이션이 쓰기 전에 출력이 충분한 양으로 누적될 때까지 출력을 유지하여 I/O 양을 최소화하는 것입니다.

입력 시 애플리케이션이 할 수 있는 일은 한 번에 입력에서 읽는 바이트 수를 조정하는 것뿐입니다(글쎄, 많은 바이트를 수신한다고 보장되지 않기 때문에 최소한 요청하는 바이트 수는 조정됩니다. 파일 바이트가 더 적을 수 있습니다) 예를 들어 파이프 또는 tty 장치의 경우 해당 시점에 사용 가능).

stdio입력 스트림의 버퍼를 해제하고 버퍼 크기를 1바이트로 설정하는 데 사용됩니다 .

한 번에 한 바이트씩 읽는 것은 비효율적이며 일반적으로 필요하지 않습니다.

필요할 수 있는 상황은 검색할 수 없는 입력(예: 파이프이므로 f일반 파일인 경우 사용자의 것이 아님) 에서 읽을 때이고 prog다른 프로세스가 읽기를 재개할 수 있도록 파일의 특정 지점에서 읽기를 중지해야 하는 경우입니다. 거기 언제.

예를 들어:

seq 10 | { grep -q 5; cat; }

6~10행을 출력 하려면 파일 읽기를 중지한 다음 행 cat입니다 grep(이것은 파이프이므로 검색할 수 없습니다).

위 명령은 grep모든 출력을 한 번에 읽었기 때문에 아무것도 반환하지 않습니다.seq

다음 사항에 주의하세요.

{ seq 5; sleep 1; seq 6 10; } | { grep -q 5; cat; }

그러면 효과가 있을 것입니다. grep큰 버퍼도 요청하지만 당시에는 처음 5줄만 사용할 수 있으므로 grep처리되어 5줄에서 종료됩니다. 즉, 버퍼가 가득 차거나 eof에 도달하여 처리를 시작할 때까지 입력을 축적하지 않습니다(내가 아는 유일한 명령은 이와 같은 작업을 수행합니다 mawk).

특정 명령을 사용하면 GNU 및 FreeBSD 시스템에서 입력 버퍼링을 조정할 수 있습니다 stdbuf -i. (unbuffer)를 사용하는 것은 stdbuf -i0(크기 1의 버퍼로 읽기)와 동일하며 stdbuf -i1입력이 한 번에 한 바이트씩 읽혀지게 됩니다.

GNU에서는 작동하지 않지만 grepGNU에서는 작동합니다 sed.

$ seq 10 | { sed -n /5/q; cat; }
$ seq 10 | { stdbuf -i0 sed -n /5/q; cat; }
6
7
8
9
10

다음을 사용하여 straces의 크기가 조정되는 것을 볼 수 있습니다 read().

$ seq 5 | { strace -e read sed -n /2/q; cat; }
[...]
read(0, "1\n2\n3\n4\n5\n", 4096)        = 10
+++ exited with 0 +++
$ seq 5 | { strace -e read stdbuf -i0 sed -n /2/q; cat; }
[...]
read(0, "1", 1)                         = 1
read(0, "\n", 1)                        = 1
read(0, "2", 1)                         = 1
read(0, "\n", 1)                        = 1
+++ exited with 0 +++
3
4
5
$ seq 5 | { strace -e read stdbuf -i1 sed -n /2/q; cat; }
[...]
read(0, "1", 1)                         = 1
read(0, "\n", 1)                        = 1
read(0, "2", 1)                         = 1
read(0, "\n", 1)                        = 1
+++ exited with 0 +++
3
4
5

답변2

아니요, 거기는 아닙니다.

질문에 대한 변경 사항그렇게 하는 방법은 명시적으로 제외됩니다.. 프로그램에서 원하는 작업을 수행하도록 프로그램을 편집하거나 도구를 사용하여 동적 로더 및 C 런타임 라이브러리의 내부에 연결하여 setvbuf프로그램이 시작될 때 호출되도록 예약할 수 있습니다.

해당 기능이 허용 되지 않으면 setvbuf이를 수행할 수 있는 방법이 없습니다 . 전화를 거는 setvbuf것은 사람이 꼭 해야 할 일입니다.

추가 읽기

관련 정보