#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#define FIFO_FILENAME "./testfifo"
static int do_reader(void){
int fd;
char buf[128];
printf("call open\n");
fd = open(FIFO_FILENAME, O_RDONLY);
fd(fd < 0){ // 예외처리
perror("open()");
return -1;
}
read(fd, buf, sizeof(buf));
printf("writer said...%s\n", buf);
close(fd);
return 0;
}
static int do_writer(void){
int fd;
char buf[128];
printf("make fifo\n");
unlink(FIFO_FILENAME); // 기존에 있던 파일 지우고 다시 생성.
if(mkfifo(FIFO_FILENAME, 0644)){
perror("mkfifo()");
return -1;
} // 예외처리.
printf("call open\n");
fd = open(FIFO_FILENAME, O_WRONLY);
fd(fd < 0){ // 예외처리
perror("open()");
return -1;
}
strncpy(buf,"hello",sizof(buf));
write(fd, buf, strlen(buf)); // file 보내기 위해 write API 사용.
close(fd);
return 0;
}
/*fifo sender/receiver*/
int main(int argc, char **argv){
if (argc<2){
printf("Usage : %s w or r\n", argv[0]);
return -1;
} // 파라미터가 안들어왔다는 뜻.
if (!strcmp(argv[1], "r")){
/*reader*/
do_reader();
} else if (!strcmp(argv[1], "w")) {
/*writer*/
do_writer();
} else {
printf("Usage : %s, w or r\n", argv[0]);
} // 이도저도 아닌 - 입력 잘못한 것들.
return 0;
}
/*named fife는, named fife = fifo를 만드는 AIP와
read, write 를 하는 API가 분리되어있다.
여기서는 do_writer()가 그 역할을 한다. mkfifo 가 named fipe를 만드는 역할.
*/
/*mkfifo 를 만드는 과정에서는 누가 reader고 누가 writer인지 알 수 없다.
그래서 open() API를 호출할 때 결정이된다.
read만 할건지 write만 할건지 둘 다 할건지 flag를 넘겨주게 되어있다.
그래서 do_writer()는 WRITEONLY, do_read는 READONLY flag를 달고 open을 해야
플래그가 한 방향으로 흐를 수 있게 된다. */
/*fifo는 pipe와 다르게 fork를 이용하지 않아도 unrelated process간에도 사용할 수 있으니까
한 코드에서 두개의 동작을 할 수 있게 한다. */