#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FIFO_FILENAME "./testfifo"
static void print_usage(char *progname)
{
printf("%s (w|r)\n", progname);
return;
}
static int do_reader(void)
{
int fd;
char buf[128];
printf("call open()\n");
fd = open(FIFO_FILENAME, O_RDONLY); //해당 프로세스는 read 역할
if (fd < 0) {
perror("open()");
return -1;
}
read(fd, buf, sizeof(buf)); //pipe에서 데이터를 읽어와 buf에 저장
printf("writer said...%s\n", buf); //buf에 저장된 문자열 출력
close(fd);
return 0;
}
static int do_writer(void)
{
int fd;
char buf[128];
printf("make fifo\n");
unlink(FIFO_FILENAME); //기존에 FIFO_FILENAME이 있다면 그 파일을 지우기
if (mkfifo(FIFO_FILENAME, 0644)) { //named pipe 생성
perror("mkfifo()"); //예외 처리
return -1;
}
printf("call open()\n");
fd = open(FIFO_FILENAME, O_WRONLY); //open을 통해 해당 프로세스가 writer 담당이 됨
if (fd < 0) { //오픈 예외 처리
perror("open()");
return -1;
}
strncpy(buf, "hello", sizeof(buf)); //buf에 문자열 저장
write(fd, buf, strlen(buf)); //write로 buf에 저장된 문자열 가져오기
close(fd);
return 0;
}
/* fifo (s|r) */
int main(int argc, char **argv)
{
if (argc < 2) { //메인 함수 파라미터 예외 처리 argc는 파라미터 개수,argv[0]은 프로그램 이름 개수 1개 픽스
print_usage(argv[0]);
return -1;
}
if (!strcmp(argv[1], "r")) { //입력된 파라미터 값이 r이면 read 실행
/* reader */
do_reader();
} else if (!strcmp(argv[1], "w")) { //입력된 파라미터 값이 w이면 read 실행
/* writer */
do_writer();
} else {
print_usage(argv[0]);
return -1;
}
return 0;
}
//터미널 두 개로 하나는 write 실행 하나는read 실행해볼 것!!
//write만 실행했을 때 open에서 blocking 된 상태로 있다가 read 실행되면 blocking 해제