본문 바로가기
Programming/C++

리눅스 파이프 예제

by 작은별하나 2019. 12. 25.
반응형

아직도 리눅스 파이프를 쓰는 경우가 있는지, 가끔씩 파이프 프로그램을 지식인에서 물어보는 경우가 있네요.

 

linux pipe

 

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);
    }
}
728x90

'Programming > C++' 카테고리의 다른 글

로또 출력하기  (0) 2019.11.28
초성 표시하기  (0) 2014.12.26
마크로를 이용해서 문자열 찍기  (0) 2014.12.02
문자열 처리  (0) 2014.09.26
C++로 문자열 입력받아서 출력 변환하기..  (2) 2014.09.24

댓글