서버에서 데이터를 스트리밍하고 행을 쓰는 명령이 있습니다 stdout
. 많은 수의 레코드를 파이프하고 싶지만 less
사용자가 다음 페이지로 이동할 때까지 내 도구가 데이터를 계속 스트리밍하지 못하도록 하고 싶습니다. 그렇지 않으면 도구가 계속 사용자가 보기 전에 대량의 데이터를 다운로드합니다.
less
사용자가 다음 페이지로 이동할 때까지 입력 프로세스가 표준 출력에 기록하는 것을 차단 합니까 , 아니면 less
전체 입력을 어딘가에 버퍼링하려고 합니까?
less
후자인 경우 플래그나 코드의 일부 구현 세부 사항을 통해 동작을 전자로 변경할 수 있습니까? 아니면 자체 페이징 시스템을 구현해야 합니까?
답변1
Less는 입력 내용을 느리게 읽습니다. 필요한 부분만 읽어줍니다. 입력이 파이프인 경우 파이프에 쓰는 프로그램은 파이프의 고정 크기 버퍼(보통 512B에서 몇 kB)를 채우면 결국 차단됩니다.
사용자가 검색이나 검색 실패 등 파일 끝에 도달해야 하는 명령을 사용하면 >
게으름이 멈춥니다 . 이러한 요청을 충족하려면 파일 끝까지 읽어야 합니다. 입력이 무한한 경우(파이프에 쓰는 프로그램이 영원히 쓰기 때문에) 요청이 완료되지 않습니다.
명령이 너무 오래 걸리면 사용자는 를 사용하여 명령을 중단할 수 있습니다 Ctrl+C. 이로 인해 입력이 닫히는 횟수가 적어지며, 이는 파이프 버퍼가 가득 차면 파이프에 쓰는 프로그램이 SIGPIPE 신호를 수신하게 됨을 의미합니다. 인터럽트를 사용한 후 Ctrl+C입력이 파이프에서 오는 경우 입력 읽기를 재개할 수 있는 방법이 없습니다.