named pipe에서 데이터를 읽기 위해 select를 사용하는데 질문이 있습니다.
글쓴이: baramseo / 작성시간: 목, 2009/11/19 - 1:28오후
named pipe에서 데이터를 읽기 위해 select를 사용하는데
처음에 server를 실행하면 시간내에 못읽으면 0을 반환하여 의도한 대로 동작을 합니다.(데이터 없음 메시지 출력)
그런데 client가 파이프 파일을 열었다 닫으면
읽을 데이터가 없는것 같은데도 select는 계속 read_fd를 셋팅해줍니다.("데이터 읽음 : "메시지 무한반복)
소스는 아래와 같습니다.
왜 이런현상이 발생하나요?
검색능력이 떨어져서 구글에서 몇 시간동안 뒤져봤는데 답을 못찾았습니다.
고수 분들의 도움을 기다립니다.^^ 꾸벅.
halfduplex.h #define HALF_DUPLEX "/tmp/halfduplex" #define MAX_BUF_SIZE 255
server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <ctype.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "halfduplex.h" /* For name of the named-pipe */ #include <sys/time.h> int main(int argc, char *argv[]) { int fd, ret_val, count, numread; char buf[MAX_BUF_SIZE]; int is_select; fd_set fd_read; struct timeval time_val; /* Create the named - pipe */ ret_val = mkfifo(HALF_DUPLEX, 0666); if ((ret_val == -1) && (errno != EEXIST)) { perror("Error creating the named pipe"); exit (1); } /* Open the pipe for reading */ // fd = open(HALF_DUPLEX, O_RDONLY); fd = open(HALF_DUPLEX, O_NONBLOCK); /* Read from the pipe */ while (1) { FD_ZERO(&fd_read); FD_SET(fd, &fd_read); time_val.tv_sec = 1; time_val.tv_usec = 0; is_select = select(fd+1, &fd_read, NULL, NULL, &time_val); if (is_select > 0) { numread = read(fd, buf, MAX_BUF_SIZE); buf[numread] = 0; printf("Half Duplex Server : Read From the pipe : %s\n", buf); if (buf[0] == 'x') break; } else printf("Noting to read...\n"); } return 0; }
client.c #include <stdio.h> #include <errno.h> #include <ctype.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "halfduplex.h" /* For name of the named-pipe */ int main(int argc, char *argv[]) { int fd; char buf[100]; /* Check if an argument was specified. */ /* Open the pipe for writing */ fd = open(HALF_DUPLEX, O_WRONLY); close(fd); return 0; }
Forums:
read() 가 다 못 빼 내는 거 아닌가요?
그러니까,
rv = read( fd, buf, size )
에서 rv != size 라서 그런 건 아니구요?
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
왜 nonblocking mode로
왜 nonblocking mode로 open하셨나요?
이러면 다 읽지도 않았는데 read()함수에서 return됩니다.
이 옵션을 빼고 open해보시는 걸 추천드립니다.
명확한 이유가 있다면 사용할 수 있지만, 얼핏 살펴본 코드에서는
특별히 그럴 이유가 없어보입니다.
댓글 달기