-
[Unix] 파이프운영체제/Unix 2019. 5. 21. 15:39
파이프
- 파이프
- 쉘 파이프 구현
- 파이프 함수
- 이름 있는 파이프
목표
- 파이프의 개념과 원리에 대해 이해한다.
- 파이프를 이용해 부모 자식 간의 통신을 해본다.
파이프란?
- 파이프는 주로 액체(물) 수송에 많이 사용된다. 물이 들어가는 곳과 물이 나오는 곳이 정해져 있다.
즉 한 방향 통신임을 추측할 수 있다 - 파이프는 프로세스 간의 데이터 통신에 사용된다.
- 파이프는 두 개의 파일 기술자를 가진다
- 하나의 파일 기술자는 쓰기용, 다른 하나는 읽기 용으로 읽는다.
파이프 사용해보기
- 파이프를 이용해 데이터를 읽고 데이터를 출력해보겠습니다.
$ who | sort
who로 입력된 데이터를 파이프에 넣은 다음 sort 명령어를 이용해 순차적으로 출력.
파이프를 사용한 부모 자식 간에 데이터 통신
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define MAXLINE 100 /* 파이프를 통해 자식에서 부모로 데이터를 보내는 프로그램 */ int main( ) { int n, length, fd[2]; int pid; char message[MAXLINE], line[MAXLINE]; pipe(fd); /* 파이프 생성 */ if ((pid = fork()) == 0) { /* 자식 프로세스 */ close(fd[0]); sprintf(message, "Hello Mr. Cho,,,\nfrom PID %d\n", getpid()); printf("strlen = %d\n", strlen(message)); length = strlen(message)+1; write(fd[1], message, length); } else { /* 부모 프로세스 */ close(fd[1]); n = read(fd[0], line, MAXLINE); printf("n=%d\n", n); printf("[%d] %s", getpid(), line); } exit(0); }
#include <unistd.h>
int pipe(int fd [2]);
파이프를 생성한다. 성공하면 0을 실패하면 -1을 리턴- pipe(fd); // 파이프를 생성한다.
생성하고 나면 fd [0]은 3, fd [4]는 4라는 값이 들어가게 된다.
3, 4이 의미하는 것이 무엇일까? 현재 열린 파일을 의미한다. 4는 파이프를 가리킨다.
우리는 파이프 또한 파일이라는 것을 추측할 수 있다.
그림으로 표현하면 아래 그림과 같다. - if ((pid = fork()) == 0) // 자식 프로세스를 실행한다.
자식 프로세스는 부모 프로세스와 동일한 데이터 구조를 가진다
따라서 아래 그림과 같이 된다. - close(fd [0])
fd [0]을 제거한다. - write(fd [1], message, length);
fd [1]에 message 값을 쓴다. 즉 파이프라는 파일에 값을 저장한다. - close(fd [1])
부모 프로세스에서 파이프에 값을 쓰지 않기 때문에 제거한다.
출력 화면
정리 및 느낀 점
- 파이프는 프로세스 간의 데이터 통신을 구현한다.
- 파이프는 입력, 출력 파일 기술자를 가지며, 파일이다.
- 부모와 자식 프로세스간의 통신을 해보았다.
참조
- 창병모, 리눅스 프로그래밍, 생능출판사, 2014
728x90'운영체제 > Unix' 카테고리의 다른 글
[Unix] 한눈에 보는 유닉스 (0) 2019.05.18 [Unix] 시그널 처리 (0) 2019.05.14 [Unix] 시그널 (0) 2019.05.14 [Unix] 파일 상태 정보 (0) 2019.05.08 [Unix] 파일 잠금 함수 : fcntl() (0) 2019.05.08