안녕하세요, 환영합니다
이번 시간에는 파이프와 파이포의 개념과 프로그래밍을 살펴볼 겁니다
파이프와 파이포는 프로세스와의 통신에 사용됩니다
인터페이스 통신일 뿐입니다
파이프는 사실 두 정보 사이의 통신 기반입니다
과정요
파이프엔 양 끝이 있어요
한쪽은 갈대 끝이고 다른 쪽은 오른쪽 끝이죠
이 예시로 파이프를 보죠
이 모형 안에 파이프 같은 게 있어요
이 파이프엔 끝이 두 개예요
여기가 끝이고 여기가 또 끝이죠
여기가 오른쪽 끝이고 여기가 갈대 끝이죠
자세한 설명은 나중에 확인하겠습니다
한쪽에는 프로세스가 있고 다른 쪽에는 프로세스가 있어요
프로세스에서 두 프로세스가 서로 통신할 수 있는지 혹은 파이프를 통해 데이터를 보낼 수 있는지 등을 봅니다
파이프는 단향성 데이터 흐름으로 간주됩니다
그 말은...
왼쪽의 프로세스는 파이프에 있는 데이터에 기록합니다 그러면 여기 있는 파이프에 데이터가 나타나죠
예를 들면 파이프를 통해 더 많은 걸 알 수 있어요
어디 보죠
파이프의 모양은 어떻죠?
파이프는 여기 보이는 것처럼 단향성이에요
네 여기에 데이터가 쓰여 있으면 한 방향으로만 흐르고 다른 쪽에서 데이터를 읽어요 ? 네,
맞아요
파이프도
용량이 제한돼 있어요 보통 64kB는 파이프 용량인데 파이프는 0이죠
하지만 이 파이프는 완충기에 불과해요
핵심 메모리에 유지돼 있어요
여기 보이는 파이프는 완충기에 불과해요
커널 메모리와 버퍼에 존재하는 데이터 구조와 같습니다
보통 크기는 60-4k예요
그리고 파이프에 데이터가 가득 차면 새로운 데이터가 오른쪽에 적을 수 없습니다
이 파이프가 데이터의 최대 수라고 가정해 보죠
이제 파이프 차례입니다 오른쪽 끝에서 쓰는 과정은 읽는 과정이 데이터를 읽을 때까지 쓸 수 없습니다 ????
파이프가 가득 차면 쓰기 과정이 막혀요
맞아요 그리고 글을 쓰면 데이터가 파이프에 전달되고 데이터를 읽으면 그 파이프에서 데이터가
삭제되죠
이 경우엔 일반 파이프를 고려할 수 있어요
여기에는 물이 흐르는 곳이 있어요 여기에 물을 부으면 물이 여기서
나와요
수도꼭지를 틀면 파이프로 물이 흘러나올 거예요
비슷한 걸 적용할 수 있어요
탭이 닫혀 있다고 해보죠
파이프에 물이 가득 차면 새로운 물이 못 들어와요
그리고 마찬가지로 수도꼭지를 열자마자 물이 흘러들어와 안으로 새 물이 들어갈 수 있어요
파이프 안에 있는 데이터도 마찬가지고요
읽기 프로세스로 읽고 데이터가 꽉 차면 오른쪽이죠
수도관으로 가는 건 막힙니다
이제 파이프를 만들어 볼게요
파이프를 사용하려면 유니스트d를 포함해야 해요 h
파이프는 두 개의 int를 가지고 있습니다
한 번은 쓰는 부분이고 다른 한 번은 읽는 부분이에요
그래서 설명을 정리해야 해요 파일 설명을 기반으로 파이프를 작동하죠
네 여기선 두 정수를 배열로 놓고 파이프라는 함수를 호출하고 파일 설명을
전달합니다
파일도 돌려주고요
설명서는 읽기 끝과 오른쪽 끝으로 채워질 겁니다
파이프는 파일 설명으로 반환됩니다
1이 0에 나타납니다 이것처럼 0에 나타나요 두 정수의 배열이죠 0의 d와 1의 fd요
1의 d가 오른쪽 끝이고 0의 f는 빨간색 끝이라고 할 수 있죠
이 경우 파이프를 열 때
0의 f, 1의 f
네 1의 f는 오른쪽 끝이고 0의 f는 파이프 끝으로 읽히죠
데이터 흐름 방향도 단일이고요
오른쪽 끝에서 읽기 끝으로 데이터가 흘러요
네
파이프 함수가 성공하면 0을 반환합니다
오류가 있으면 1을 반환하고요
이제 파이프가 사용되는 응용 프로그램을 생각해보죠
파이프는 관련 공정을 진행할 때 주로 사용합니다
예를 들어 부모와 자식이 프로세스를 진행할 때 자식은 데이터를 보낼 수 있습니다
안녕하세요
부모는 파이프를 통해 아이에게 데이터를 보낼 수 있습니다
네 그리고 또 중요한 점은 부모가 포크한 후 자식 프로세스를 만들 때 자식 프로세스는 부모 파일 설명의
복사본을 상속받습니다 따라서 모든 파이프 파일 설명이 , 부모 파일 설명에서 상속을
받죠
부모와 자식이 만나는 과정이죠
더 정확한 이해를 위한 예제로 보게 될 겁니다
이제 부모가 자식 프로세스를 만드는 상황을 생각해 보죠
그리고 부모 프로세스가 이미 파이프를 생성해 자식 프로세스를 포크로 이동하면 이
경우 왼쪽에 있는 figure도 고려될 수 있습니다 이 경우
1의 빈 파일과 0의 f는 부모 프로세스와 자식 프로세스가 공유합니다
이런 상황입니다 부모 프로세스가 이미 파이프를 열었을 때죠 자식 프로세스를 포크했어요
네 이제 응용 프로그램의 목적을 보죠 자식 프로세스에서 할 일은 읽기 끝을
닫고
네 예를 들어 과정 중 하나에서 부모 프로세스가 읽기 끝을 닫겠죠
만약
그럼... 데이터가 부모에서 아이에게 전달되고 아이에게서 글자를 닫아야 해요
그래서 닫으면 오른쪽에도 비슷한 상황이 발생하는 걸 볼 수 있죠
부모 프로세스가 자식 프로세스에 데이터를 보내야 한다고 해보죠
네 그럼 이게 왼쪽이 이니셜이 됩니다 이 상황에선 파일 설명이 두 프로세스에 모두 사용 가능하죠
부모 프로세스와 자식 프로세스에 말입니다
하나
하지만 자녀 과정의 분리가 일어난 후 하나의 과정으로 un이 문을 닫게 됩니다
파이프 문서를 사용하세요
네 이 경우 부모에서 자식으로 데이터를 넘겨야 하면 부모는 읽기 끝을 닫고 자식은
오른쪽 끝을 닫게 됩니다
아이가 부모에게 데이터를 보내야 할 때도 마찬가지죠
그럼 아이가 죽겠죠
후방을 닫아요
부모는 이걸 읽고 부모는 오른쪽 끝을 닫죠
프로그램에서 예제를 볼 수 있습니다
그리고 수도관을 손볼 때 신호가 잡혔어요
병든 파이프라고 불리죠
배관이 아프다는 건 보통 그런 신호예요
책이나 파이프가 부러졌을 때 발생하죠
이 신호는 오른쪽 끝으로 간다는 뜻이죠
절차요
낭독이 끝나면요
파이프를 생각해 보세요
그리고 두 개의 두 개의 과정이 파이프를 통해 서로 소통할 때
네 이제 이제 안 돼요, 안 돼요
네 그런데 읽기 과정이 끝나자마자 파일을 닫으면 신호가
파이프로 전달되는 거죠
예제에서 파이프 개념도 보게 될 겁니다
이제 이해를 돕기 위해 예를 들어보죠
이제 간단한 프로그램이 있어요
여기서는 필수 헤더 파일을 포함하고 있습니다
아뇨
말씀드린 대로 정수 배열을 선언할 겁니다
박사 학위가 2개라고 가정하죠 화재 파이프 작업을 위한 완충재도 좀 가져왔고요
이제 파이프를 열죠
네 파이프를 열기 위해서는 함수 파이프를 호출하고 함수에 파일 설명을 전달해야 합니다 ????
그리고 만약 1을 반환하면 파이프가 생성되지 않았고 에러가 발생하여 프로그램이
종료됩니다
파이프가 성공하면 마이너스 1은 반환되지 않고 이 라인으로 들어옵니다
if D는 0, fd는 1이에요
프레젠테이션에서 언급한 대로요
1의 3이 오른쪽 끝이고 0의 d가 판독 끝이라면요
네 이제 프로그램으로 돌아가 보죠 1의 d가 작성 끝을 잡으면 f는 작성 끝의
파일 설명이고 f는 읽기 끝의 파일 설명입니다
이제 편지를 쓸 수 있어요
네
파이프 끝
파일 작업과 비슷해요
이전 비디오 세션에서 얘기했던 것입니다 올바른 시스템 호출을 사용할 것입니다
버프 인 더 버프
이 문자열을 저장합니다 데이터 흐름 데모죠
일부 문자열은 버퍼에 저장합니다
버퍼는 1번 파일 설명을 통해 쓰고 있어요
버퍼의 길이가 얼마든 오른손에 파이프에 기록됩니다
네 이제 파이프에서 데이터를 읽으려면 시스템 호출 읽기를 써서 fd를 0으로
지정해야 해요 ?
F는 파이프 끝에 판독을 위한 파일 설명자입니다 읽기 데이터는 데이터라고 불리는
새 버퍼에 저장됩니다
그리고 여기 저장된 데이터는 5바이트밖에 안 됩니다
네 이 읽기와 쓰기 연산은 아까 다뤘던 파일 연산과 유사합니다
할 수 있어요
파이프에서 읽을 수 있는 바이트를 명시해 주세요
첫 번째 글은 5바이트라는 겁니다
두 번째는 다음 다섯 바이트를 읽고 다음으로는 파이프의
데이터를 읽습니다
이제 이걸 컴파일하죠
이제 프로그램을 실행하죠
여길 보면 알 거예요
하지만 프로그램은 완전한 줄을 파이프에 적습니다
파이프 오른쪽 끝에 있어요
읽기 시스템 콜은 처음 다섯 바이트를 읽습니다
처음 5 바이트 파이프랑 그리고 공간요 처음 5 바이트는
다음은 데이터와 띄어쓰기입니다 다음 다섯 바이트는
그리고 10바이트의 데이터를 읽었습니다
이제 10바이트의 데이터를 읽었습니다
이 경우에는
이 경우 이 읽기 작업은 파일 작업과 유사합니다
우리가 이야기 했던 내용이죠 예를 들어 파이프의 바이트 수가 여기 지정된 숫자보다
작다면 실제 읽기의 수를 반환하는 것입니다
이 경우에는 실제 바이트는 보여주지 않았지만 이걸 보여줍니다
이거요
네 함수 호출은 파일 작업에서 앞서 다뤘던 읽기 및 쓰기와 유사합니다
이걸로 할 수 있어요
할 수 있어요
여기에 파이프를 만들었다고 합시다 파이프를 만드는 동안 오른쪽 끝을 잡을 수 있는 파일
설명을 전달했습니다 읽기 파일 설명도요
그리고 이 경우엔 데모죠 과정이 같아요 오른쪽 끝에서 읽기 오른쪽 끝에서 읽기 , 오른쪽
끝에서 읽기
네 이 프로그램에선 한 가지 프로세스만 실행돼요 파이프에서의 기본 작업이 어떻게 실행되는지
보여줍니다
네 다음 프로그램에선 파이프를 이용해 두 가지 과정을 살펴볼 겁니다 부모와 자식 간의 상호 작용
과정이죠
이 프로그램에는 필수 헤더 파일을 포함하고 있습니다
여길 보시면 지난 비디오 세션에서 부모로부터의 자식 과정 생성 방법을 다뤘던
걸 기억하실 수 있죠
이 경우에는 fork를 만들기 전에
절차가 파이프를 만들었어요
여기서 논의했던 다이어그램으로 돌아가죠
지금 상황은 이렇습니다
왼쪽에서 할 일은 먼저 파이프를 만드는 거예요
먼저 파이프를 생성하고 하위 프로세스 포킹을 합니다
자녀 프로세스가 분리가 되면 자녀 프로세스와 부모 프로세스가 공유합니다
파이프 설명서
즉 둘 다 1이 파이프의 오른쪽 끝이고 0이라면 둘 다 읽기
끝인 거죠
당장
1점 감점 대비해서요
포크에 문제가 있었던 거지 이런 걸 만든 게 아니에요
성공적이지 못했죠
0번은 그 시점이죠
자식 프로세스가 있는데 기본값은 부모 프로세스가 되겠죠
이건 부모 프로세스예요
이게 자식 과정이에요
네 이전 부모 자식 프로세스에 대한 설명을 다시 보고 이해를 해보세요
부모 자식 프로세스를 생성하기 위해 현재는 자식 프로세스를 닫고 있습니다
오른쪽 끝
그래서 지금 우리가 만들려는 건 인물의 오른쪽에 있는 거예요
자식 프로세스에서 오른쪽 끝을 닫습니다
네 지금 닫으려는 건 차원 프로세스에서 파이프에 쓰려는 게 아니기 때문이죠
그리고요
닫은 다음에 while 루프를 합니다
콜론은 while과 비슷합니다
영원히 반복되는 루프에서요
바이트를 읽고 있어요
설명은 생략합니다
자식 프로세스는 0부터 읽습니다
네 배열 인덱스 이건 읽기입니다 파일의 마지막 부분이고 읽기는 바이트 수를 알려줍니다
, 읽기
마찬가지로, 1을 입력하면 종료가 됩니다
읽기에 문제가 있다는 뜻이죠
그리고 값을 0으로 한다면 파이프의 다른 쪽은 닫혔다는 의미입니다
부모의 절차가 끝나면
파이프 오른쪽 끝
자식 프로세스에서 읽힐 바이트는 0이 됩니다
따라서 부모 프로세스가 파이프의 오른쪽 끝을 닫자마자 루프에서 벗어나죠
출산 과정도요
읽기 끝의 파일 설명을 닫고 자식 프로세스를 종료합니다
이제 나옵니다
부모의 절차죠
네 부모 프로세스는 자식 프로세스와 비슷하지만 부모 프로세스는 오른쪽 끝만 잡고
읽기 끝을 닫죠
이제 보여드리죠
부모 절차가 마무리되고 있어요
끝부분 읽어요
이제 부모 프로세스는 인수에서 전달되는 데이터를 작성합니다
명령줄 인수와
파이프 오른쪽 끝으로 올라가죠 2초 정도 잔 후에요
파이프 오른쪽 끝을 닫아요
파이프
파이프 오른쪽 끝이 닫히면 바로요
성장 과정이죠
파이프의 바이트 수는 0이 될 것입니다
더 잘 이해할 수 있게 이 프로그램을 편집해보죠
이제 프로그램을 실행하죠
명령줄 인수를 통과시켜야 해요
이 경우엔 명령줄 인수로 프로그램을 실행하고 있죠
부모 프로세스는 작성이죠
명령줄이에요 파이프로 넘긴 명령줄요 하위 프로세스가 읽기를 읽죠 파이프
끝
이제 네 , 하위 프로세스에서
읽힌 거죠
파이프에 작성한 부모 프로세스가 끝나자마자 오른쪽 끝을 닫습니다
2초간 잔 후에 부모가 오른쪽 끝을 닫아요
부모가 하는 일이 끝나자마자요
네 그리고 하위 과정이 파이프의 내용을 읽으려고 할 때 바이트의 읽음 수는 0이 되었고 이 줄을
출력합니다 이 줄입니다
아무것도 아니에요
하지만 부모가 오른손을 닫았다고 나와 있어요
이게 우리가 가진 지문이에요
여기서 알아두실 건 이 피겨로 돌아갈 때
네 그래서 그래서 데이터는 오른쪽 끝에서 읽기 끝으로
흘러갑니다 ???
이제
오른손을 연 오른쪽 프로세스가 파일을 닫았습니다
그리고∙∙∙
네 이제 읽기 프로세스가 읽기를 하면 바이트의 읽기는 0으로 반환됩니다 , 이 때
이제 식스 파이프 프로그램을 보죠
이건 토크 파이프를 시연하는 프로그램입니다
이 프로그램은 이전과 똑같아요
우리가 얘기했던 것 말이에요 이 경우 유일한 차이점은
네 이 경우 읽기 끝이 닫히고 오른쪽 끝이 닫히자마자 오른쪽 끝에서 프로세스가
실행되죠
오른쪽 끝에는 시그 파이프가 있어요
프로그램을 보죠
자, fork가 있는 것과 같은 방식으로, fork를 만들었고 여기 파이프가 있습니다.
전에 파이프를 만들고 포크라고 불렀어요
case 0은 자녀 프로세스를 나타내고 기본값은 부모 프로세스를 나타냅니다
이제 자녀 교육이 마무리됩니다
오른손을 이렇게 해요
부모가 읽기 끝을 닫는 것과 같은 방식이죠
자식 프로세스는 한동안 기다립니다 한 번의 루프든 영원히 루프든요
이제 숫자를 읽습니다
파이프 내용물을 읽죠 끝부분을요
그리고 이제 만약 어떤 시점에 실행되는 프로세스를 읽기 끝이 닫는다면, child가 읽기 끝을
닫습니다.
읽기 엔드가 닫히자마자 오른쪽 끝-rid-sidiv와 sig파이프에서 실행되는 프로세스가 바로
이거죠
기본값으로 sig 파이프의 기본 동작은 나가는 것입니다
부모의 절차죠
부모 노릇은 아니지만요
신호를 받는 과정에서 사라지죠
네 이 경우 파이프가 부모 프로세스로 수신되고 부모 프로세스는 종료됩니다
정리해서 이해하도록 하죠
그럼 프로그램을 실행하죠
매개 변수를 전달하죠
부모가 파이프에 인사를 전달하면 자식 프로세스가 그걸 읽습니다
하지만 그 이후에는 후천적인 과정이 끝나버려요
그 말은 파이프에서 데이터를 읽은 후 자식 프로세스가 읽기 끝을 마쳤다는 거죠
자, 이제∙∙∙
다시 이 부분으로 돌아오죠
데이터를 받은 자식이 읽기 끝을 닫았어요
읽기 끝이 닫히면 신호가 전송됩니다
이 신호는 배식 파이프로 오른쪽 끝을 지탱하는 과정으로 전달됩니다
이제 식염수를 받을 거예요
부모 프로세스와 부모 프로세스는 종료됩니다
그걸 볼 수 있어요
여기요
여기 이 프린트가 파이프에 데이터를 쓰려는 걸 볼 수 있죠
여기 오면요
네 파이프에 데이터를 쓰려는데 그 이후 부모 프로세스가 종료되죠
결론은 병든 파이프예요
프로세스가 받으면 프로세스는 종료되고 병리 파이프가 받습니다
읽기 끝에서 실행되는 프로세스가 읽기 파일 설명을 닫으면요