select 함수 return value problem
글쓴이: cpulpul / 작성시간: 토, 2003/03/08 - 4:24오후
간단히 source를 보여드리겠습니다
#define FIRST "fifo_file" #define SECOND "/dev/xxxx" char buff[BUFF_SZ]; int state; struct timeval tv; fd_set readfds; /* fifo 초기화 */ fd[0] = open(FIRST, O_RDONLY); fd[1] = open(SECOND, O_RDONLY); for (;;) { FD_ZERO(&readfds); FD_SET(fd[0], &readfds); FD_SET(fd[1], &readfds); tv.tv_sec = 1; tv.tv_usec = 0; state = select(fd[1]+1, &readfds, (fd_set *)0, (fd_set *)0, &tv); switch (state) { case -1: perror("select error : "); printf("errno %d\n", errno); exit(0); case 0: break; default : if (FD_ISSET(fd[0], &readfds)) { if (read(fd[0], buff, BUFF_SZ) > 0) /* data 처리 */ } if (FD_ISSET(fd[1], &readfds)) { if (ioctl(fd[2], 0, &data) == 0) /* data 처리 */ } break; } }
select함수에서 -1을 return 하며 빠져나와버립니다.
fd[1] 이 문자장치 이여서 그런건지도.. 고수님들의 답변을 부탁드립니다.
Forums:
사용자 프로그램은 해당 파일이, 정규 파일이건, 장치 파일이건
사용자 프로그램은 해당 파일이,
정규 파일이건, 장치 파일이건 상관없이 사용하지만
커널 내부에서는 각각 따로 구현이 되어 있습니다.
해당 장치 파일에 구현되어 있는 select 함수를 참조하셔야 할것 같네요.
perror("select error : "); 여기에서 출력
perror("select error : ");
여기에서 출력되는 error message를 보여주세요.
---
http://coolengineer.com
아마 fd[0] fd[1]의 값을 에러체크 안하셔서 그럴 것 같기도 한데
아마 fd[0] fd[1]의 값을 에러체크 안하셔서 그럴 것 같기도 한데
윗분 말씀대로 perror로 에러 내용을 프린트 해보셔야 정확하게 알 수 있습니다.
rommance.net
에러 번호가 어찌 나올지 궁금하네요.
블럭이 되는 함수들의 경우 에러로 인해 -1을 리턴한다면 반듯이 ERRNO값을 체크해주어야 합니다. 이값을 체크해서 프로그램한 사람이 예상했던(반듯이 처리해야하는 코드) 에러코드에대해서는 적당한 처리를 해주어야 합니다.
f[1]+1을 최대 디스크립터로 잡는것은 위험한 발상이므로(보장되지 안는다는 의미죠) (f[0]>f[1]?f[0]:f[1])+1 정도로 교채하시길 권하며, 현재의 코드에는 크게 무리는 없습니다.
ERRNO값을 체크해보시길 바람니다.
Do you think that's the air you are breathing now?
답변에 감사 드립니다.. perror에러 내용입니다..
select error : : No such device or address
errno 0
역시
예상했던대로 파일을 열지 못했네요..
장치 파일을 사용한다고 하셨는데..
그 장치가 설치 및 초기화되어 있지 않거나..
퍼미션에 문제가 있는 듯 합니다.
장치나 파일의 path를 한번 더 확인해 보시기 바랍니다.
특히 "fifo_file"이 실제로 존재하는지도 확인하는 것이 필요할것 같군요.
그리고 할 수 있으면 루트로 실행시켜보세요.
서명:
이것은 올리는 글에 첨부될 사인 문구입니다. 제한은 255 글자입니다
윗글에 대한 답입니다..
답변에 정말 감사드립니다..
"/dev/ipxxx" 는 link 이고..
실제화일은
path : /devices/pseudo/ 경로 아래..
crw------- 1 root root 96, 3 3월 6일 17:09 ip@0:iplog
입니다...
여러 고수님들의 도움을 기다리겠습니다..
fd[0] = open(FIRST, O_RDONLY); fd[1] =
fd[0] = open(FIRST, O_RDONLY);
fd[1] = open(SECOND, O_RDONLY);
일단 파일을 여시고,
에러체크를 하셔야 합니다.
에러체크 안하면 무슨 상황이 날지 모르기 때문에 절대 안정적인 플그램이 아니죠
그리고 이렇게 하셔야 무슨 일 때문에 에러가 났는 지 알 수 있습니다. 그냥 파일명이 이렇다고 설명만 하시면 알 수가 없죠.
rommance.net
송지석님의 답변에 감사드립니다.
실제 코드에는 error검사를 수행하고 있습니다..
커널level에서 특정 data를 가공하여 위의 file에 담아두고, 그file을 open하여 읽어오는데.. 커널에서의 file 설정이 문제인듯 합니다..
답변에 정말 감사드립니다..
댓글 달기