Linux에서 파이프 용량 설정

Linux에서 파이프 용량 설정

Bash(또는 다른 쉘) 스크립트에 정의된 파이프의 파이프 용량을 설정하는 방법이 있습니까? 예를 들면

cmd1 | cmd2

최근 Linux에서는 파이프 크기가 ​​기본적으로 64KB로 설정되어 있습니다. 두 프로세스 간에 "버퍼링되는" 데이터의 양을 제어할 수 있는 두 가지 방법이 있다는 것을 알고 있습니다.

  1. 용도 buffer(1): 예:cmd1 | buffer | cmd2
  2. fcntl(2)F_SETPIPE_SZ내부 cmd1또는 외부 표지판 과 함께 사용cmd2

각 솔루션에는 단점이 있습니다. buffer버퍼를 늘리는 데에만 사용할 수 있으며 기본 파이프 용량에 쓰기에는 여전히 다운스트림 명령을 깨워야 합니다. 내가 아는 한, 또는 fcntl내부에서만 호출할 수 있습니다 .cmd1cmd2

내 질문은: 쉘이 파이프를 생성할 때 파이프에 어떤 용량이 있어야 하는지 쉘에서 지정하는 방법이 있습니까?

답변1

기본 파이프 용량에 쓰려면 여전히 다운스트림 명령을 깨워야 합니다.

다운스트림 명령을 너무 자주 깨우지 않는 것이 목표인 경우 이 -p옵션을 사용해 보셨나요 buffer? buffer버퍼가 특정 비율로 채워질 때까지 쓰기가 유지 됩니다 . -s큰 덩어리로 쓰려면 이 옵션이 필요할 수도 있습니다 .

업데이트: 아, 명령 사이의 파이핑은 여전히 ​​몇 가지 사항을 제한합니다. 아마도 다음 어댑터 프로그램을 사용해 보십시오:

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
  fcntl(atoi(argv[1]), F_SETPIPE_SZ, atoi(argv[2]));
  execvp(argv[3],argv+3);
  while (1);
}

좋다:

adapter 1 (BIGSIZE) cmd1 | cmd2

심지어:

adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2

cmd1여전히 작은 쓰기가 이루어지는 경우 .

답변2

DepressedDaniel과 Stéphane Chazelas의 조언에 따라 저는 한 줄의 내용에 가장 가까운 것을 선택했습니다.

function hugepipe {
  perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "$@"
}

이를 통해 다음 작업이 가능합니다:

hugepipe <command> | <command>

두 명령 사이의 파이프는 fcntlperl 스크립트에서 지정한 용량을 갖습니다.

관련 정보