아직도 리눅스 파이프를 쓰는 경우가 있는지, 가끔씩 파이프 프로그램을 지식인에서 물어보는 경우가 있네요.
pipe 는 두개의 프로세스간에 통신 채널을 열어주는 역할을 합니다. 두개의 파일 디스크립터가 하나는 쓰기용, 다른 하나는 읽기용으로 연결이 됩니다.
프로세스는 fork() 에 의해서 열어주면 되고요. 이것을 이용하면 다양한 기능들을 할 수 있지만, 요즘은 쓰레드 형태로 프로그램을 많이 짜서 pipe() 함수와 fork() 함수 이용도가 떨어진 것 같네요.
이곳에 간단한 예제를 올립니다.
두개의 프로세스를 열고, 1부터 1,000까지의 합을 구하는데, 전반부는 자식 프로세스에서 합을 구하고, 그 합을 pipe를 통하여 보내주면, 후반 부 합을 부모 프로세스에서 구한 후에, 그 결과를 차일드 프로세스에게 전달하면, 최종적으로 차일드 프로세스에서 출력을 하는 프로그램입니다.
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int fd1[2], fd2[2];
pid_t pid;
pipe(fd1);
pipe(fd2);
pid=fork();
if(pid)
{
int status, sum, i;
close(fd1[1]);
close(fd2[0]);
for(sum=0,i=1;i<=500;i++) sum+=i;
write(fd2[1], &sum, sizeof(sum));
waitpid(pid, &status, 0);
read(fd1[0], &sum, sizeof(sum));
printf("sum = %d\n", sum);
}
else
{
int sum, i;
close(fd1[0]);
close(fd2[1]);
read(fd2[0], &sum, sizeof(sum));
for(i=501;i<=1000;i++) sum+=i;
write(fd1[1], &sum, sizeof(sum));
_exit(0);
}
}
반응형
'Programming > C++' 카테고리의 다른 글
로또 출력하기 (0) | 2019.11.28 |
---|---|
초성 표시하기 (0) | 2014.12.26 |
마크로를 이용해서 문자열 찍기 (0) | 2014.12.02 |
문자열 처리 (0) | 2014.09.26 |
C++로 문자열 입력받아서 출력 변환하기.. (2) | 2014.09.24 |
댓글