xargs: 시스템 정의 한계에 도달할 때까지 명령줄을 빌드합니다. 한계는 무엇입니까? [복사]

xargs: 시스템 정의 한계에 도달할 때까지 명령줄을 빌드합니다. 한계는 무엇입니까? [복사]

findutils 4.6.0에서 xargs의 소스 코드를 간략히 살펴본 결과 'n'이 정의되어 있음을 발견했습니다. args_per_exec 하지만 find utils에는 args_per_exec에 대한 기본값이 없는 것 같습니다.

그렇다면 '시스템 정의 제한'은 어디에 정의되어 있습니까?

임의의 명령 길이에 대한 일반적인 질문이 아닌 맨페이지 항목에 대한 설명으로 질문이 표시되므로 중복되지 않습니다.

답변1

sysconf(_SC_ARG_MAX)환경 문자열과 2048바이트의 헤드룸을 포함하여 제한은 입니다 . 이는 인수 개수가 아닌 실제 문자열 + 구분 널 바이트의 최대 길이입니다. 이것은 GNU에서 온 것입니다 xargs.원천:

      /* IEEE Std 1003.1, 2003 specifies that the combined argument and
       * environment list shall not exceed {ARG_MAX}-2048 bytes.  It also
       * specifies that it shall be at least LINE_MAX.
       */
      long val;
#ifdef _SC_ARG_MAX
      val = sysconf (_SC_ARG_MAX);
      if (val > 0)
        {
          assert (val > XARGS_POSIX_HEADROOM);
          /* Note that val can in fact be greater than ARG_MAX
           * and bc_ctl.arg_max can also be greater than ARG_MAX.
           */
          bc_ctl.arg_max = smaller_of (bc_ctl.arg_max,
                                       (size_t)val-XARGS_POSIX_HEADROOM);

그런 다음 128k로 제한하세요.bc_use_sensible_arg_max(), 그러나 다음 옵션을 사용하여 늘릴 수 있습니다 -s.

void
bc_use_sensible_arg_max (struct buildcmd_control *ctl)
{
#ifdef DEFAULT_ARG_SIZE
  enum { arg_size = DEFAULT_ARG_SIZE };
#else
  enum { arg_size = (128u * 1024u) };
#endif

의 경우 한계 계산과 클램핑은 동일합니다 find -exec ... {} +. 위의 코드는 다음 논리를 복제합니다.bc_get_arg_max()그리고bc_init_controlinfo(), 후자는 headroom매개변수 2048 및 으로 호출됩니다.find/parser.cxargs/xargs.c

GNU xargs에도 --show-limits옵션이 있습니다.

관련 정보