흥미로운 출력 버퍼 질문!

3211 단어

to be update, this is a note for me.



jyy에서 매우 흥미로운 문제가 발생했습니다.

다음과 같은 코드가 있습니다.

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
  int n = 2;
  for (int i = 0; i < n; i++) {
    fork();
    printf("Hello\n");
  }
  for (int i = 0; i < n; i++) {
    wait(NULL);
  }
}


이 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.

//gcc fork-printf.c && ./a.out
Hello
Hello
Hello
Hello
Hello
Hello


6개의 '안녕하세요'가 있습니다.

그러나 파이프 명령을 사용하면 다음과 같습니다.

//gcc fork-printf.c && ./a.out | cat
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello


우리는 8개의 'hello'를 받을 것입니다.



Linux에서 stdout을 사용할 때:

termianl의 경우: linux 사용line buffer , 문자\n를 충족하는 경우 linux는 시스템 호출을 사용하여 모든 버퍼를 출력합니다.

파이프/파일의 경우: 버퍼 크기가 최대 4096B인 경우 Linux는 full buffer를 사용합니다(fflush(stdout)를 호출하는 경우 제외).

조건 Ⅰ의 경우 라인 버퍼를 사용하여 직접 출력합니다. 그렇지 않으면 조건 Ⅱ의 경우 전체 버퍼를 사용합니다.

좋은 웹페이지 즐겨찾기