* IPC(Inter Process Communication)
- 프로세스들끼리 데이터를 주고 받는 기능을 수행
- Pipe/Socket과 같은 것을 이용한다.
* Pipe
- 메모리 버퍼 영역을 가르킨다.
> 버퍼 : 각 프로세스가 통신하면서 사용하는 임시 공간
- 각 Pipe당 읽기용 포트 한개와 쓰기용 포트 한개를 갖는다.
- file descriptor로 접근을 하여 파일을 읽고 쓰는 듯이 사용을 한다.
- Unix계열에서 오래전 부터 사용된 IPC형식이다.
> Linux shell에서 "|" 기호를 사용하여 Pipe로 사용할 수 있다.
ex) ls -al | ./a.out : ls -al 의 결과(output)가 ./a.out의 input으로 작용한다.
- Race Condition을 방지하기 위해서 단방향에서 쓰는 것이 일반적이다.
- Pipe 통신을 하는 개체(Process)들은 서로 특수한 관계에 있다.(부모-자식)
> 부모 프로세스는 자식 프로세스를 생성하기 전에 파이프를 생성하여 서로 파이프를 공유해야 한다.
- Volatile(휘발성) : Process가 끝나면 Pipe는 자동으로 소멸하게 된다.
- 필요한 Header file : unistd.h
- int pipe(int fd[2])
> 정상적으로 Pipe가 생성되면 0을 에러가 발생하면 -1을 반환한다.
> fd[0]과 fd[1]은 각각 읽기모드와 쓰기모드의 입출구 역할을 한다.
- Pipe를 생성하면 위와 같이 양방향 통신이 가능한 형태로 생성이 된다.
- Race Condition이 우려되므로 단방향 통신형태로 바꾼다.
> Pipe의 용도에 따라서 Parent > Child 또는 Child > Parent 방향으로만 통신이 되게 바꾼다.
> 양뱡향 통신을 원한다면 2개의 파이프를 이용해서 구현해야한다.
----------------------------------------------------------------------------------------------------------------
(예제 소스코드) - Linux Man page
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int pfd[2];
pid_t cpid;
char buf;
assert(argc == 2);
if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
cpid = fork();
if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
if (cpid == 0) { /* Child reads from pipe */
close(pfd[1]); /* Close unused write end */
while (read(pfd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pfd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pfd[0]); /* Close unused read end */
write(pfd[1], argv[1], strlen(argv[1]));
close(pfd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}