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


25

Linux 커널에서 파이프가 구현되는 방법에 대해 읽고 있었고 이해를 확인하고 싶었습니다. 내가 틀렸다면 정확한 설명이있는 답이 선택됩니다.

  • Linux에는 커널에 마운트 된 pipefs라는 VFS가 있습니다 (사용자 공간이 아님).
  • pipefs는 하나의 수퍼 블록을 가지며 자체 루트 ( pipe:)에 마운트됩니다/
  • 대부분의 파일 시스템과 달리 pipefs는 직접 볼 수 없습니다
  • pipefs의 항목은 pipe(2)syscall을 통해 이루어집니다
  • pipe(2)와 배관 용 쉘에서 사용하는 시스템 콜 |(다른 프로세스에서 수동 또는) 연산자는 일반 파일처럼 거의 작동 pipefs에 새 파일을 작성
  • 파이프 연산자의 왼쪽에있는 stdout파일이 pipefs에서 작성된 임시 파일로 경로 재 지정되었습니다.
  • 파이프 연산자의 오른쪽 stdin에있는 파일은 pipefs의 파일로 설정되어 있습니다.
  • pipefs는 메모리에 저장되고 커널 마법을 통해 저장됩니다.

파이프 (예 :)가 어떻게 ls -la | less작동 하는지에 대한이 설명이 정확합니까?

내가 이해하지 못하는 한 가지는 bash와 같은 것이 프로세스를 설정하는 방법 stdin또는 stdout에서 반환 한 파일 설명자 pipe(2)입니다. 나는 아직 그것에 대해 아무것도 찾을 수 없었습니다.


같은 이름을 가진 상당히 다른 두 가지 계층에 대해 이야기하고 있습니다. pipe()지원을 (그 기계와 함께 커널 호출 pipefs등)이보다 훨씬 낮은 수준이다 |쉘에서 제공하는 연산자. 후자는 일반적으로 전자를 사용하여 구현되지만 반드시 그럴 필요는 없습니다.
Greg Hewgill

그렇습니다. |운영자가 pipe(2)bash처럼 프로세스로 호출 한다고 가정하면서 하위 수준 작업을 구체적으로 언급하고 있습니다.
Brandon Wamboldt

답변:


19

지금까지의 분석은 일반적으로 정확합니다. 쉘이 프로세스의 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

감사! 왜 dup2호출이 필요한지 궁금 해서 파이프 디스크립터를 stdin에 직접 할당 할 수 없습니까?
Brandon Wamboldt

3
호출자는에서 파일 디스크립터를 작성할 때 파일 디스크립터의 숫자 값을 선택할 수 없습니다 pipe(). dup2()호출은 호출자가 (필요한 0,1,2 stdin의되는 입출력, 표준 오류로 인해) 특정 숫자 값이 파일 디스크립터를 복사 할 수있다. "stdin에 직접 할당"과 동등한 커널입니다. C 런타임 라이브러리 전역 변수 stdinFILE *커널 관련이 아닙니다 (설명자 0에 연결되도록 초기화되었지만).
Greg Hewgill

좋은 답변입니다! 나는 세부 사항에서 조금 길을 잃었다. exec ()를 실행하기 전에 왜 close (p [1])를하는지 궁금하십니까? dup2가 반환되면 p [1]이 fd 0을 가리 키지 않습니까? 그런 다음 close (p [1])은 파일 디스크립터 0을 닫습니다. 그러면 자식 프로세스의 stdin에서 어떻게 읽을 수 있습니까?
user1559897

@ user1559897 : dup2통화가 변경되지 않습니다 p[1]. 대신, 두 개의 핸들하게 p[1]0같은 커널 오브젝트 (파이프)을 가리키고있다. 자식 프로세스에는 두 개의 stdin 핸들이 필요하지 않으므로 (번호가 매겨진 핸들이 무엇인지 알 수 없음 p[1]) p[1]전에 닫힙니다 exec.
Greg Hewgill

@GregHewgill Gotchu. 고마워!
user1559897
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.