programing

리눅스에서 파이프는 어떻게 작동합니까?

telecom 2023. 8. 13. 09:32
반응형

리눅스에서 파이프는 어떻게 작동합니까?

배관은 어떻게 작동합니까?CLI를 통해 프로그램을 실행하고 출력을 파일로 리디렉션하면 해당 파일이 작성되는 동안 다른 프로그램으로 파이프를 연결할 수 있습니까?

기본적으로 파일에 한 줄을 쓸 때 두 번째 응용 프로그램으로 즉시 파이프로 연결하고 싶습니다(기존 프로그램에서 그래프를 동적으로 끌어내려고 합니다).다음 명령으로 이동하기 전에 파이프가 첫 번째 명령을 완료하는지 여부만 확인합니다.

어떤 피드백이라도 주시면 대단히 감사하겠습니다!

한 프로그램의 출력을 다른 프로그램의 입력으로 리디렉션하려면 간단한 파이프라인을 사용하십시오.

program1 arg arg | program2 arg arg

의 출력을 저장하려는 경우program1파일에 넣고 파이프로 연결합니다.program2사용할 수 있습니다.

program1 arg arg | tee output-file | program2 arg arg

파이프라인의 모든 프로그램이 동시에 실행됩니다.대부분의 프로그램은 일반적으로 차단 I/O를 사용합니다. 즉, 입력을 읽으려고 하지만 아무것도 없으면 차단합니다. 즉, 더 많은 입력을 사용할 수 있을 때까지 실행되도록 예약을 취소합니다(CPU를 다 써버리지 않도록).마찬가지로 파이프라인의 이전 프로그램이 나중 프로그램이 읽을 수 있는 속도보다 더 빨리 데이터를 쓰는 경우, 결국 파이프의 버퍼가 채워지고 작성기가 차단됩니다. OS는 파이프의 버퍼가 판독기에 의해 비워질 때까지 예약을 취소하고 다시 쓸 수 있습니다.


편집

의 출력을 사용하려는 경우program1명령줄 매개 변수로 백쿼트를 사용할 수 있습니다.$()구문:

# Runs "program1 arg", and uses the output as the command-line arguments for
# program2
program2 `program1 arg`

# Same as above
program2 $(program1 arg)

$()구문은 더 명확하고 중첩될 수 있으므로 선호해야 합니다.

파이프는 두 번째 명령을 실행하기 전에 첫 번째 명령을 완료하지 않습니다.Unix(및 Linux) 파이프는 모든 명령을 동시에 실행합니다.다음과 같은 경우 명령이 일시 중단됩니다.

  • 입력이 부족합니다.

  • 그것은 후계자가 소비할 준비가 된 것보다 훨씬 더 많은 생산량을 생산했습니다.

대부분의 프로그램에서 출력이 버퍼링됩니다. 즉, OS가 상당한 양의 출력(약 8000자)을 축적한 후 파이프라인의 다음 단계로 전달합니다.이 버퍼링은 프로세스와 커널 간의 과도한 전환을 방지하는 데 사용됩니다.

파이프라인의 출력을 즉시 전송하려면 버퍼링되지 않은 I/O를 사용할 수 있습니다. 이는 C에서 다음과 같은 호출을 의미합니다.fflush()버퍼링된 출력이 즉시 다음 프로세스로 전송되도록 합니다.버퍼링되지 않은 입력도 가능하지만 입력이 부족한 프로세스는 일반적으로 전체 버퍼를 기다리지 않고 얻을 수 있는 모든 입력을 처리하기 때문에 일반적으로 불필요합니다.

일반적인 응용 프로그램의 경우 버퍼링되지 않은 출력은 권장되지 않습니다. 일반적으로 기본값으로 최상의 성능을 얻을 수 있습니다.그러나 첫 번째 프로세스에 사용 가능한 정보가 있는 즉시 동적 그래프를 작성하려면 버퍼링되지 않은 출력을 사용해야 합니다.를 사용한다면, C로 하세요.fflush(stdout)당신이 출력을 보내고 싶을 때면 언제든지 충분할 것입니다.

이 를 사용하여 하는 경우stdin그리고.stdout그렇다면 당신이 전화하고 있는지 확인하세요.fflush(stdout)표준 IO 버퍼링을 비활성화하는 방법을 찾거나 기록한 후에 사용할 수 있습니다.C/C++에서 파이프라인을 가장 잘 구현하는 방법을 설명하는 가장 좋은 참고 자료는 UNIX 환경의 고급 프로그래밍 또는 UNIX 네트워크 프로그래밍: Volume 2입니다.당신은 아마 이 기사로 시작할 수도 있을 것입니다.

두 프로그램이 파일 읽기 및 쓰기를 고집하고 stdin/stdout을 사용하지 않으면 파일 대신 명명된 파이프를 사용할 수 있습니다.

mknod(1) 명령을 사용하여 명명된 파이프를 만듭니다.

$ mknod /tmp/named-pipe p

그런 다음 /tmp/named-pipe를 읽고 쓰도록 프로그램을 구성합니다(적절한 경로/이름 사용).

이 경우 두 프로그램이 병렬로 실행되어 다른 답변에 설명된 대로 파이프가 가득 차거나 비어 있을 때 필요에 따라 차단됩니다.

언급URL : https://stackoverflow.com/questions/1072125/how-does-a-pipe-work-in-linux

반응형