stdbuf의 완전 버퍼링 모드를 사용하면 안 되나요?

stdbuf의 완전 버퍼링 모드를 사용하면 안 되나요?

내 시스템(최근 업데이트된 Arch Linux)에서 맨페이지의 "BUGS" 섹션에는 stdbuf다음이 포함되어 있습니다.

GLIBC 플랫폼에서 완전 버퍼링 모드를 사용하는 경우에도 버퍼 크기를 지정하면 정의되지 않은 작업이 발생합니다.

이런 일이 발생하는 이유와 "정의되지 않은 작업"이 무엇을 의미하는지에 대해 조금 궁금해하는 것 외에도 가장 큰 관심사는 이것이 명령에 대한 버퍼 크기를 지정해서는 안 된다는 의미인지, 그리고 그것이 내 눈앞에서 폭발할 것인지 여부입니다. 하다 .

답변1

stdbuf이는 이전 버전의 잔재일 뿐이며 더 이상 현실과 일치하지 않는 것 같습니다 .

안에논평소스 코드 에서 stdbuf다음과 같이 말합니다.

/* Note currently for glibc (2.3.5) the following call does not change
   the buffer size, and more problematically does not give any indication
   that the new size request was ignored:
       setvbuf (stdout, (char*)NULL, _IOFBF, 8192);

그러나 실제 코드는 C 라이브러리에 의존하지 않고 계속해서 (마지 못해?) 버퍼 자체를 할당하여 문제가 있는 동작을 완전히 우회합니다.

      if (size > 0)
        {
          if (!(buf = malloc (size))) /* will be freed by fclose()  */

그리고 (동일한 의견에서) 이것은 더 이상 사실이 아닌 것 같습니다.

   Another issue is that on glibc-2.7 the following doesn't buffer
   the first write if it's greater than 1 byte.
       setvbuf(stdout,buf,_IOFBF,127);

-i및 옵션 에 대해 내가 어떤 주장을 하든 -o이 옵션은 꽤 잘 처리하는 것 같습니다. 예:

$ echo 'int main(){ int c; while((c=getchar()) != EOF) putchar(c); }' | cc -include stdio.h -x c - -o slowcat
$ strace -s5 -e trace=read,write stdbuf -i143 -o127 2>&1 ./slowcat </dev/zero >/dev/null | awk '/ELF/{next}1;++n>5{exit}'
read(0, "\0\0\0\0\0"..., 143)           = 143
write(1, "\0\0\0\0\0"..., 127)          = 127
read(0, "\0\0\0\0\0"..., 143)           = 143
write(1, "\0\0\0\0\0"..., 127)          = 127
read(0, "\0\0\0\0\0"..., 143)           = 143
write(1, "\0\0\0\0\0"..., 127)          = 127

관련 정보