리눅스 인강 - fifo.c

Run Settings
LanguageC
Language Version
Run Command
#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간에도 사용할 수 있으니까 한 코드에서 두개의 동작을 할 수 있게 한다. */
Editor Settings
Theme
Key bindings
Full width
Lines