Linux에서 파이프가 작동하는 방식

Linux에서 파이프가 작동하는 방식

저는 Linux 커널에서 파이프가 어떻게 구현되는지에 대해 읽었으며 제가 이해한 내용을 확인하고 싶었습니다. 내가 틀린 경우 올바른 설명이 포함된 답변이 선택됩니다.

  • Linux에는 (사용자 공간이 아닌) 커널에 설치되는 Pipefs라는 VFS가 있습니다.
  • pipe:파이프라인fs 에는 슈퍼블록이 있으며 자체 루트(/
  • 대부분의 파일 시스템과 달리 Pipef는 직접 볼 수 없습니다.
  • Pipefs 입력은 pipe(2)시스템 호출을 통해 이루어집니다.
  • pipe(2)쉘은 운영자의 파이프 시스템 호출( |또는 다른 프로세스에서 수동으로)을 사용하여 일반 파일과 매우 유사하게 작동하는 파이프라인fs에 새 파일을 생성합니다.
  • 파이프라인 연산자 왼쪽에 있는 파일은 stdout파이프라인fs에서 생성된 임시 파일로 리디렉션 됩니다.
  • 파이프라인 연산자 오른쪽에 있는 파일은 stdin파이프라인fs의 파일로 설정 됩니다.
  • 파이프라인fs는 메모리에 저장되며 일부 커널 매직을 통해 페이징되어서는 안 됩니다.

예를 들어 파이프의 기능에 대한 설명이 ls -la | less아주 정확합니까?

내가 이해하지 못하는 한 가지는 bash와 같은 프로세스가 어떻게 설정되는지입니다 stdin.' 또는 이에 대한 정보를 찾지 못했습니다.stdoutpipe(2)

답변1

귀하의 분석은 일반적으로 지금까지 정확합니다. 쉘이 프로세스의 stdin을 파이프 설명자로 설정하는 방식은 다음과 같습니다(의사 코드).

pipe(p) // create a new pipe with two handles p[0] and p[1]
fork() // spawn a child process
    close(p[0]) // close the write end of the pipe in the child
    dup2(p[1], 0) // duplicate the pipe descriptor on top of fd 0 (stdin)
    close(p[1]) // close the other pipe descriptor
    exec() // run a new process with the new descriptors in place

관련 정보