Pipe
프로세스간의 통신은 동시에 접근 가능한 메모리 공간만 있다면 얼마든지 가능하다.
하지만, 프로세스는 서로 완전히 별개의 메모리 구조를 가진다.
따라서, 프로세스간 통신은 Pipe를 이용한다.
Pipe는 Socket과 마찬가지로 OS에 속하는 자원으로 fork의 복사 대상이 아니다.
#include <unistd.h>
int pipe(int filedes[2]);
// 성공시 0, 실패시 -1 반환
// filedes[0] 파이프로부터 데이터를 수신하는데 사용되는 파일 디스크립터가 저장.
// 즉, 파이프의 출구
// filedes[1] 파이프로 데이터를 전송하는데 사용되는 따일 디스크립터가 저장된다
// 즉, 파이프의 입구
Pipe 기반 프로세스간의 단방향 통신
파이프 생성
부모 프로세스 = 출력 경로
자식 프로세스 = 입력 경로
#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
int main(int argc, char *argv[])
{
int fds[2];
char str[]="Who are you?";
char buf[BUF_SIZE];
pid_t pid;
pipe(fds); // 파이프 생성
pid=fork(); // 자식 프로세스는 2개의 파일 디스크립터 소유(pipe가 아니다.)
if(pid==0)
{
write(fds[1], str, sizeof(str));
}
else
{
read(fds[0], buf, BUF_SIZE);
puts(buf);
}
return 0;
}
Pipe 기반 프로세스간의 양방향 통신 (1)
#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
int main(int argc, char *argv[])
{
int fds[2];
char str1[]="Who are you?";
char str2[]="Thank you for your message";
char buf[BUF_SIZE];
pid_t pid;
pipe(fds);
pid=fork();
if(pid==0) // 자식
{
write(fds[1], str1, sizeof(str1));
sleep(2); // 중요
read(fds[0], buf, BUF_SIZE);
printf("Child proc output: %s \n", buf);
}
else // 부모
{
read(fds[0], buf, BUF_SIZE);
printf("Parent proc output: %s \n", buf);
write(fds[1], str2, sizeof(str2));
sleep(3);
}
return 0;
}
Pipe 기반 프로세스간의 양방향 통신 (2)
#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
int main(int argc, char *argv[])
{
int fds1[2], fds2[2];
char str1[]="Who are you?";
char str2[]="Thank you for your message";
char buf[BUF_SIZE];
pid_t pid;
pipe(fds1), pipe(fds2);
pid=fork();
if(pid==0)
{
write(fds1[1], str1, sizeof(str1));
read(fds2[0], buf, BUF_SIZE);
printf("Child proc output: %s \n", buf);
}
else
{
read(fds1[0], buf, BUF_SIZE);
printf("Parent proc output: %s \n", buf);
write(fds2[1], str2, sizeof(str2));
sleep(3);
}
return 0;
}
Pipe 기반 프로세스의 적용