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 설정

'💻 Computer Science > System' 카테고리의 다른 글

[System] Semaphore  (1) 2024.01.26
[System] Shared Memory  (1) 2024.01.26
[System] 메모리 맵핑  (1) 2024.01.26
[System] 시그널  (1) 2024.01.25
[System] 프로세스 관리  (1) 2024.01.25