이번 포스팅은 파이프에 대하여 알아보도록 하겠습니다.
● 이름 없는 파이프(PIPEs)
-> 파이프는 두 프로세스 간에 통신을 할 수 있도록 인터페이스를 제공합니다. (부모-자식 프로세스 간 통신)
-> 파이프는 기본적으로는 단방향이지만 두 개의 파이프를 이용하여 양방향도 가능은 합니다.
-> 파이프도 일종의 파일이기 때문에 읽고 쓸 수 있는 파일 기술자가 필요합니다. (부모-자식 간에는 파일 기술자를 공유하고 있기 때문에 통신이 가능한거죠)
파이프와 관련하여 제공되는 함수
- 파이프 만들기 : popen(), pipe()
- 파이프 닫기 : pclose()
파이프 생성함수를 통해 파이프를 만들게 되면 fd[0](read전용), fd[1](write전용) 파일 기술자가 생성되고 단방향 통신 특성상 부모-자식 프로세스에서 사용하지않는 기술자는 close를 닫아줘야합니다.
만약 양방향통신을 진행하게 될 경우에는 각각의 프로세스에서 파일 기술자 2개씩을 사용하여 줍니다.
● 이름 있는 파이프(FIFOs)
-> 이름 있는 파이프를 제공함으로써 독립적인 프로세스에서 통신이 가능합니다.
-> 함수로 FIFO 파일을 생성하면 저수준 파일 입출력 함수로 이 파일을 읽고, 쓸 수 있습니다.
-> FIFOs 또한 PIPEs와 마찬가지로 단방향 통신입니다.
● FIFOs 예제 (Server-Client)
/* Server.c */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { int pd1, pd2, d, n, m; char msg[100] = "Hello, Client"; //전송할 메시지 저장 char inmsg[80]; //클라이언트로부터 메시지를 받아올 배열 선언 printf("Server ====\n"); mkfifo("./HAN-FIFO", 0666); //FIFO 파이프(파일) 생성 if((pd1=open("./HAN-FIFO", O_WRONLY)) == -1) { perror("open"); exit(1); } if((pd2 = open("./HAN-FIFO2", O_RDONLY)) == -1) { perror("open"); exit(1); } printf("To Client : %s\n", msg); n = write(pd1, msg, strlen(msg) + 1); // write전용으로 연 파일에 msg 쓰기 if (n == -1) { perror("write"); exit(1); } close(pd1); // pd1 파이프 닫기 printf("Client ====\n"); write(1, "From Server :", 13); // 표준 입출력 1번에 문자열 쓰기 while((m=read(pd2, inmsg, 80)) > 0) // read전용으로 연 파일 열어서 문자열 읽어오기 write(1, inmsg, m); if( m == -1) { perror("read"); exit(1); } write(1,"\n", 1); close(pd2); } |
위 예제소스는 Server단 코드이며, write전용으로 쓸 HAN-FIFO파이프를 생성한 뒤 각각의 파이프를 open하여 Client와의 통신을 보여주고 있습니다.
/* Client.c */ #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int main(void) { int pd1, pd2, d, n, m; char msg[100] = "Hello, Server"; char inmsg[80]; printf("Client ====\n"); if(mkfifo("./HAN-FIFO2", 0666) == -1) { perror("mkfifo"); exit(1); } if((pd1=open("./HAN-FIFO", O_RDONLY)) == -1) { perror("open"); exit(1); } if((pd2 = open("./HAN-FIFO2", O_WRONLY)) == -1) { perror("open"); exit(1); } printf("To Server : %s\n", msg); n = write(pd2, msg, strlen(msg) + 1); if (n == -1) { perror("write"); exit(1); } close(pd2); printf("Server ====\n"); write(1, "From Server :", 13); while((m=read(pd1, inmsg, 80)) > 0) write(1, inmsg, m); if( n == -1) { perror("read"); exit(1); } write(1,"\n", 1); close(pd1); } |
위 예제소스는 Client단 코드이며, 기본적으로 Server와 같은 형식의 코드이며, 다른 점은 각각의 read/write파일을 다르게 열어 사용한다는 점입니다.
아래는 위 예제소스들을 실행한 결과값입니다. IPC가 원활히 이루어지고 있는 것을 볼 수 있습니다.
이번 포스팅에서는 파이프를 이용한 IPC기법에 대해서 알아보았고, 다음 글에서는 System V IPC 기법에 대해 알아보도록 하겠습니다.
'CS > 시스템 프로그래밍' 카테고리의 다른 글
시스템 V IPC (System V) 2 -Infinite (0) | 2022.06.21 |
---|---|
시스템 V IPC (System V) 1 -Infinite (0) | 2022.06.21 |
시그널(signal) -Infinite (0) | 2022.06.20 |
쓰레드(Thread) -Infinite (0) | 2022.06.20 |
프로세스 생성과 실행 -Infinite (1) | 2022.06.20 |
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!