저는 Linux 커널에서 파이프가 어떻게 구현되는지에 대해 읽었으며 제가 이해한 내용을 확인하고 싶었습니다. 내가 틀린 경우 올바른 설명이 포함된 답변이 선택됩니다.
- Linux에는 (사용자 공간이 아닌) 커널에 설치되는 Pipefs라는 VFS가 있습니다.
pipe:
파이프라인fs 에는 슈퍼블록이 있으며 자체 루트(/
- 대부분의 파일 시스템과 달리 Pipef는 직접 볼 수 없습니다.
- Pipefs 입력은
pipe(2)
시스템 호출을 통해 이루어집니다. pipe(2)
쉘은 운영자의 파이프 시스템 호출(|
또는 다른 프로세스에서 수동으로)을 사용하여 일반 파일과 매우 유사하게 작동하는 파이프라인fs에 새 파일을 생성합니다.- 파이프라인 연산자 왼쪽에 있는 파일은
stdout
파이프라인fs에서 생성된 임시 파일로 리디렉션 됩니다. - 파이프라인 연산자 오른쪽에 있는 파일은
stdin
파이프라인fs의 파일로 설정 됩니다. - 파이프라인fs는 메모리에 저장되며 일부 커널 매직을 통해 페이징되어서는 안 됩니다.
예를 들어 파이프의 기능에 대한 설명이 ls -la | less
아주 정확합니까?
내가 이해하지 못하는 한 가지는 bash와 같은 프로세스가 어떻게 설정되는지입니다 stdin
.' 또는 이에 대한 정보를 찾지 못했습니다.stdout
pipe(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