tgool 2022. 12. 22. 13:21
#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 해제