Pipe

Ahn9807 (토론 | 기여)님의 2023년 2월 21일 (화) 01:34 판 (새 문서: 분류: 스레드/프로세스 == 개요 == Pipe를 통해서 연결된 프로세스 사이에서 통신하기 위한 방식이다. Data의 송수신에 있어서 파일 크기의 제약이 없는 장점이 있다. 또한 자동적으로 Synchronization이 이루어진다. 파이프는 Unnamed Pipe와 Named Pipe로 구분된다. 파이프는 유닉스 초창기부터 IPC를 위해서 이용된 방식이다. 파이프를 쉽게 생각하자면 하나의 큰 파일로 이루...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)


개요

Pipe를 통해서 연결된 프로세스 사이에서 통신하기 위한 방식이다. Data의 송수신에 있어서 파일 크기의 제약이 없는 장점이 있다. 또한 자동적으로 Synchronization이 이루어진다. 파이프는 Unnamed Pipe와 Named Pipe로 구분된다. 파이프는 유닉스 초창기부터 IPC를 위해서 이용된 방식이다. 파이프를 쉽게 생각하자면 하나의 큰 파일로 이루어진 버퍼라고 생각하면 된다.

UNIX Shell에서 파이프는 | 로 표현된다.

ls -alg | more
pic parer.ms | tbl | eqn | ditroff -ms

시스템 콜

C 프로그래밍 언어로 파이프라인을 만드는 것은 간단한 쉘 예제보다는 많은 것을 포함한다. C로 간단한 파이프를 만들기 위해 pipe() 시스템 호출을 사용한다. 이것은 두 정수의 배열인 한개의 아규먼트(argument)를 가지며, 성공하면 배열은 파이프 라인을 위해 사용되는 새로운 두개의 파일 식별자를 갖는다. 파이프를 만들고 난 후, 프로세스는 전통적으로 새로운 프로세스를 낳는다.

SYSTEM CALL: pipe();
 
PROTOTYPE: int pipe(int fd[2]);
  RETURNS: 성공시 0
           -1 on error: errno = EMFILE (자유로운 식별자가 없다)
                                EMFILE (시스템 파일 테이블이  찼다)
                                EFAULT (fd 배열이 유효하지 않다)
NOTES: fd[0] 읽기를 위해 준비되고, fd[1] 쓰기를 위해 준비된다.

예시

#include <stdio.h>

#define READ 0
#define WRITE 1

char* phrase = "Stuff this in your pipe and smoke it";

main() {
    int fd[2], bytesRead;
    char message[100];
    pipe(fd);
    if(fork()==0) //child 
    {
        close(fd[READ]);
        write(fd[WRITE], phrase, strlen(phrase) + 1);
        close(fd[WRITE]);
    }
    else
    {
        close(fd[WRITE]);
        bytesRead = read(fd[READ], message,100);
        printf("Read %d : %s\n",bytesRead, message);
        close(fd[READ]);
    }
}