Named Pipe
- 이름이 있는 파이프(특수 파일, FIFO파일)
- 독립적인 프로세스 사이의 통신을 위해 사용 가능
- FIFO 파일을 미리 만들어 두어야 함
- Kernel 내부적으로 데이터 전달(파일에 내용이 쓰여지진 않음)
creating a FIFO file
#include <sys/types.h>
#incldue <sys/stat.h>
int mkfifo(const char* pathname, mode_t mode);
IPC with a named pipe
- 두 개의 프로세스가 하나의 FIFO 파일을 통해 통신 가능
- proc.A : 쓰기 모드로 file open
- proc.B : 읽기 모드로 file open
Example
server
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void) {
int pd, n;
char msg[] = "Hello, FIFO";
printf("Server ====\n");
if ((pd = open("./pipeFile", O_WRONLY)) == -1) {
perror("open");
exit(1);
}
printf("To Client : %s\n", msg);
n = write(pd, msg, strlen(msg) + 1);
if (n == -1) {
perror("write");
exit(1);
}
close(pd);
return 0;
}
client
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int pd, n;
char inmsg[80];
printf("Client ====\n");
if ((pd = open("./pipeFile", O_RDONLY)) == -1) {
perror("open");
exit(1);
}
write(1, "From Server :", 13);
while ((n = read(pd, inmsg, 80)) > 0)
write(1, inmsg, n);
if (n == -1) {
perror("read");
exit(1);
}
write(1, "\n", 1);
close(pd);
return 0;
}
FIFO file and open
- FIFO 파일에 대한 open은 기본적으로 blocking mode
- Pipe가 양끝에서 열릴 때까지 다른 한끝의 open()이 blocking 됨
- Non-blocking mode로 열기
- flag에 O_NONBLOCK 설정