한 명령/프로그램에서 다른 명령/프로그램으로 파이프된 출력을 보내고 받는 형식은 무엇입니까? [복사]

한 명령/프로그램에서 다른 명령/프로그램으로 파이프된 출력을 보내고 받는 형식은 무엇입니까? [복사]

한 명령이 다른 명령으로 파이프될 때 파이프 출력은 어떤 방식이나 형식으로 존재/전송됩니까? 임시파일인가요? 문자열인가요? 파이프된 출력을 수신하는 명령은 어떻게 해당 출력을 디코딩/읽습니까?


예:

echo "Someone string" | ./program | tail

program프로그램 " "은 출력을 파일로 받습니까 ? echo프로그램은 이 입력을 어떻게 읽습니까?

답변1

파이프는 추가 처리를 위해 하나의 명령/프로그램/프로세스의 출력을 다른 명령/프로그램/프로세스로 보내기 위해 Linux 및 기타 Unix 계열 운영 체제에서 사용되는 리디렉션(표준 출력을 다른 대상으로 파이프링)의 한 형태입니다. Unix/Linux 시스템에서는 한 명령의 stdout을 다른 명령의 stdin에 연결할 수 있습니다. 이를 달성하려면 파이프 문자 "|"를 사용할 수 있습니다.

파이프는 두 개 이상의 명령을 결합하는 데 사용됩니다. 여기서 한 명령의 출력은 다른 명령의 입력으로 사용되며 해당 명령의 출력은 다음 명령의 입력으로 사용될 수 있습니다. 또한 두 개 이상의 명령/프로그램/프로세스 간의 임시 연결로 간주될 수도 있습니다. 추가 처리를 수행하는 명령줄 프로그램을 필터라고 합니다.

명령/프로그램/프로세스 간의 이러한 직접 연결을 통해 동시에 실행할 수 있으며 임시 텍스트 파일이나 디스플레이를 통해 데이터를 전달하지 않고도 데이터가 지속적으로 전송될 수 있습니다. 파이프는 단방향입니다. 즉, 데이터는 파이프를 통해 왼쪽에서 오른쪽으로 흐릅니다.

통사론:

command_1 | command_2 | command_3 | .... | command_N 

예: more 명령에 대한 입력으로 모든 파일과 디렉터리를 나열합니다.

$ ls -l | more 

more명령은 출력을 ls -l입력으로 사용합니다. 이 명령의 최종 효과는 ls -l한 번에 하나의 출력 화면을 표시하는 것입니다. 파이프는 컨테이너 역할을 하며 출력을 수신 ls -l하고 이를 more입력으로 전달합니다. 이 명령은 파이프가 주 메모리에 구현되어 있기 때문에 표준 출력을 ls -l표준 입력 에 연결하는 데 디스크를 사용하지 않습니다 . moreI/O 리디렉션 연산자와 관련하여 위 명령은 다음 명령 순서와 동일합니다.

$ ls -l -> temp
more -> temp (or more temp)
[contents of temp]
rm temp

1,2,

답변2

./programecho출력을 파일로 수신합니다.표준 스트림 파일/dev/stdin. 데모:

echo foo | wc -c
echo foo | wc -c /dev/stdin

산출:

4
4 /dev/stdin

참고: 스트림 파일은 디스크에 저장된 파일과 다소 다릅니다. 우리는 할 수 있다데이터에 대한 무작위 액세스일반 파일에는 있지만스트림 미디어문서. CD 플레이어와 노래를 재생하는 라디오의 차이와 같습니다. CD 플레이어에서는 노래를 되감기, 빨리 감기, 검색, 건너뛰기 등을 할 수 있습니다. 라디오는 방송사가 보내는 모든 것을 단순히 출력(또는 스트리밍)합니다.지금.

스트림은 어디에 저장되나요? 운영 체제는 이를 임시 저장소에 저장합니다.데이터 버퍼, 운영 체제에 따라 크기가 다릅니다. 바라보다파이프 버퍼는 얼마나 큽니까?


더 낮은 수준에서 운영 체제는 다음을 사용합니다.파일 설명자, 파일 이름이 아닙니다. 파일 설명자는 단지 숫자 묶음일 뿐이며, 각 숫자는프로세스 식별자자체 스택이 있습니다. Linux에서는 /dev/stdin스트림(항상 파일 설명자) 에 대한 액세스도 허용합니다."0"), 그런 식으로:

echo foo | wc -c /proc/self/fd/0

산출:

4 /proc/self/fd/0

또 다른 Linux 추상화는 util을 통해 볼 수 있습니다 realpath.

realpath /dev/stdin /proc/self/fd/0

출력(내 시스템의 현재 터미널):

/dev/pts/2
/dev/pts/2

이 문자 pts세우도시간단말기에스. 마지막 2숫자는 터미널마다 항상 다르기 때문에 신뢰할 수 있는 이름은 아니지만 다음 트릭에 숫자를 사용할 수 있습니다.새 파이프나 파일을 만들지 않고 한 터미널에서 다른 터미널로 출력을 보내는 방법.

답변3

이는 비트스트림 형태로 수행됩니다. 보내는 방법과 받는 방법은 다음과 같습니다. 인터페이스는파일 설명자(또는핸들). 간단한 파일도 이 방법으로 처리할 수 있습니다.

바라보다:

관련 정보