[리눅스 프로그래밍] - (IPC) named pipe 다루기

Yoon Yeoung-jin·2022년 7월 3일
0

Linux

목록 보기
6/13

01. Named Pipe

  • Named Pipe는 파일 경로를 ID로 사용한다.
  • 양방향 통신을 지원한다.
  • FIFO 생성과 open이 분리되어있다.
  • open()시 read-side와 write-side가 동기화 된다.
    • 즉, 양쪽 모두 open 시도가 있어야 성공한다.
    • open 시 O_NONBLOCK이 유용하게 사용될 수 있음.

02. 사용 API

  • 헤더 파일
    • sys/types.h
    • sys/stat.h
  • 사용 함수
    • int mkfifo(const char *pathname, mode_t mode);
      파라미터
       • dpathname: 생성할 named pipe 파일 경로
       • mode: permission
      반환값
       • 성공: 0
       • 실패: -1

03. 예제 코드

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>

#define PATH_NAME "/home/alwns28/example_folder/namePipe_example/fifo"
#define MAX_BUF_LEN 1024

static void print_help(const char *program_name){
    printf("Usage: %s (s|r) \n", program_name);
}

static void send_data(void)
{
    int fd;
    char buf[MAX_BUF_LEN];
    if(unlink(PATH_NAME) == -1){
        printf("파일 생성이 필요합니다.\n");
    }
    if(mkfifo(PATH_NAME, 0644) == -1){
        perror("mkfifo()");
        return ;
    }

    fd = open(PATH_NAME, O_CREAT | O_WRONLY, 0644);
    memset((void *)buf, 0, sizeof(buf));
    snprintf(buf, sizeof(buf), "fifo TEST hello world");
    printf("[SEND](%u) fifo TEST hello world\n", getpid());
    if(write(fd, (const void *)buf, sizeof(buf)) == -1){
        perror("write()");
    }
    close(fd);
}

static void recv_data(void)
{
    int fd;
    char buf[MAX_BUF_LEN];
    fd = open(PATH_NAME, O_RDONLY);
    memset((void *)buf, 0, sizeof(buf));
    if(read(fd, (void *)buf, sizeof(buf)) == -1){
        perror("read()");
        close(fd);
        return ;
    }
    printf("[RECV](%u) %s\n", getpid(), buf);
    close(fd);
}

int main(int argv, char **argc)
{
    if(argv < 2) {
        print_help((const char *)argc[0]);
        return -1;
    }

    if(!strcmp((const char *)argc[1], "r")){
        recv_data();
    } else if(!strcmp((const char *)argc[1], "s")){
        send_data();
    } else {
        print_help((const char *)argc[0]);
    }

    return 0;
}
profile
신기한건 다 해보는 사람

0개의 댓글