fork pipe 예제

더 흥미롭게 만들어 봅시다. 입력을 읽고 출력을 쓰는 명령의 가장 좋아하는 예 중 하나는 정렬입니다. 파일 인수없이 입력 리디렉션없이 사용하는 경우 터미널은 사용자가 문자열을 입력하여 정렬할 때까지 기다립니다(줄당 하나의 문자열). 사용자가 Ctrl-D(키보드를 정렬 프로세스의 stdin에 연결하는 통신 채널의 쓰기 끝을 닫는)를 입력하면 정렬을 실행하는 프로세스는 원하는 모든 문자열이 입력되었음을 알 수 있습니다. 따라서 이러한 문자열은 명령을 실행하는 프로세스로 stdin을 통해 전달되고, 해당 프로세스에 의해 정렬된 다음 stdout을 통해 터미널에 기록됩니다. 꽤 멋진! 샘플 입력/출력: 파이프는 두 파일 설명자 간에 단방향 통신 링크를 만드는 시스템 호출입니다. 파이프 시스템 호출은 두 정수의 배열에 대한 포인터로 호출됩니다. 반환시 배열의 첫 번째 요소에는 파이프의 출력에 해당하는 파일 설명자가 포함됩니다(읽을 내용). 배열의 두 번째 요소에는 파이프의 입력(물건을 쓰는 위치)에 해당하는 파일 설명자가 포함되어 있습니다. 파이프의 입력으로 전송되는 바이트는 파이프의 다른 쪽 끝에서 읽을 수 있습니다. fork() 호출은 해당 시점에서 부모의 메모리 및 파일 설명자 테이블의 복사본인 자식 프로세스를 만듭니다. 부모의 파일 설명자가 연관된 파일은 자녀의 파일 설명자가 연관된 파일과 동일합니다.

참고로 명령줄 옵션 인수는 실행된 명령의 동작 수정을 수신된 입력과 별도로 전달할 수 있는 다른 Unix 디자인 선택의 결과입니다. 인수와 입력을 별도로 유지하면 파이프가 관련될 때 수명을 더 쉽게 만들 수 있습니다. 마지막으로 한 가지 주제를 놓고 다가고 싶습니다. 지금까지의 토론에서는 세 가지 기본 파일 설명자와 함께 제공되는 기본 동작을 살펴보았으며, 여기서 모든 초기 입력 및 최종 출력에 키보드와 터미널을 사용합니다. 또한 파이프라인의 프로세스 간에 데이터를 전달하는 방법도 살펴보았습니다. 기존 파일을 입력에 키보드를 사용하는 대신 파이프라인의 첫 번째 명령에 대한 입력으로 사용하거나 마지막 파이프라인 명령의 출력을 파일에 보내려면 어떻게 해야 할까요? 이 작업은 I/O 리디렉션으로 수행할 수 있습니다. 명령줄에서 “”는 출력 리디렉션에 사용되며, 출력 파일이 존재하지 않거나 이미 있는 경우 덮어쓰는 경우 출력 파일이 만들어집니다. 내용을 덮어쓰는 대신 출력 파일에 데이터를 추가하려면 “>>”를 사용할 수 있습니다. 입력 과 출력 리디렉션을 모두 사용하는 예제를 살펴보겠습니다.

다음 내용이 있는 file words.txt가 있다고 가정해 보겠습니다: 출력을 생성하는 자식은 표준 출력을 파이프의 쓰기 끝으로 설정하고 해당 데이터를 소비하는 자식은 표준 입력을 동일한 파이프의 읽기 끝으로 설정합니다. 이 작업이 완료되면 부모는 더 이상 파이프가 필요하지 않으며 파일 설명자가 닫힐 수 있습니다. 이것은 중요합니다! 부모가 파이프의 쓰기 끝(pfd[1])을 닫지 않으면 파이프에서 읽는 자식이 파일의 끝을 읽지 않고 종료되지 않습니다. sort 명령을 실행하는 일부 C 코드의 페더틱 예제를 살펴보겠습니다. 이 예제에서는 dprintf()를 사용하여 파일 설명자에게 직접 입력을 인쇄하여 파이프가 부모로부터 자식으로 데이터를 보내는 데 사용되는 경우를 보여 준다.

Comments are closed.