select 문으로 대기하는 부분에, 입력 주는 드라이버를 작성하고 싶습니다.
글쓴이: uribery / 작성시간: 금, 2006/11/24 - 6:29오후
안녕하세요.
select()를 실행하면 그전에 설정한 FD_SET에 포함되어있는 fd에서 변화가 발생하면
return 되는 것으로 알고 있습니다.
여기에, 사용자가 만든 드라이버를 select로 대기하다가 드라이버 내부동작에 따라서
조건이 충족되면 select로 블록된 부분을 빠져 나올수 있게 하고 싶습니다.
즉, 소켓에서 데이터를 수신하면 어떤(궁금한 부분입니다.) 동작을 해서 select문이 블록상태에서
벗어나게 되는 되는지 그 동작이 궁금합니다.
select나 fd_set 등으로 찾아보아도 그 자체의 사용법에 대한 내용의 대부분이더군요.
여러분의 조언 부탁드리겠습니다.
좋은 하루 보내세요. ^^
Forums:
select 문 사용은 ..이렇게
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축 WWW.WEBMON.CO.KR
struct timeout {
long tv_sec;
long tv_usec;
};
struct timeout timeout;
while(1)
{
reaction:
timeout.tv_sec = 3;// 수신대기 3초
timeout.tv_usec =0;
testfds=readfds;
if((fd=select(FD_SETSIZE,&testfds,(fd_set*)0,(fd_set*)0,(struct timeval*)&timeout)) ==0)
{
데이터 수신이 없는 경우 코드
goto reaction;
}//
데이터 수신된경우 코드
for(fd=0;fd {
데이터가 수신된 경우 실행되는 곳으로 FD_SETSIZE 만큼 돌면서 데이터의 수신 여부를 확인한다.
if(FD_ISSET(fd,&testfds))
{
if(fd==client_fd)
{
서버에 접속되어 있는 client_fd 소켓으로 들어오는 데이터는 서버에서 보내는 데이터이다. Client_fd에 쓰기를 하는 경우는 데이터가 서버로 전송되고 서버에서 들어오는 데이터는 client_fd를 통하여 입력 받는다.
ioctl(fd,FIONREAD,&nread);
fd의 소켓의 i/o상태를 체크한다.
if(nread==0)
{
FD_CLR(fd,&readfds);
읽어 들인 데이터의 길이가 0인 경우는 서버에서 접속을 종료한 경우이다. 이러한 경우 송수신 감지를 해지한다.
}
else
{
bzero(buf,sizeof(buf));//clear buffer
if((n=recv(fd,buf,BUF_LEN,0))>0)
{
Client_fd로 들어온 데이터를 recv()함수를 이용하여 읽어 들인다.
printf("READ ->[");
for(i=0;i printf("%02X",buf[i]);
printf("]\r\n");
읽어 들인 데이터를 화면에 표시한다. 이때 화면에 표시는 표준 출력 모니터화면에 표시한다. 여기서 읽은 데이터를 데이터 개수만큼 2바이트 헥사로 표시하고 있다. 이것은 아스키 코드 데이터인 경우는 화면에 표출할수 있지만, 바이트 데이터의 경우는 표준 콘솔 화면에 나타낼 수가 없다. 그래서 2바이트 헥사로 나타낸다.
// printf("%s\r\n",buf);
} //if (n=recv
}//if (nread==0)
continue;
}//if (fd==client_fd)
}//fd_isset(fd,&testfdr)
}//for fd=0
}//while
위아래 코드는 생략했습니다.
이후에는 알아서 처리하셔야 할것 같습니다.
타임아웃이 없는 경우는 계속 블록되어 수신되는 데이터가 없는 경우 멈쳐있게 됩니다.
수신데이터가 없는 경우에 할일을 기술합니다.
수신된 데이터가 있는 경우 수신된 데이터를 읽어서
비교 합니다. 이전에 select에 등록된 속켓중 어떤 속켓에서 데이터가 감지 된는 지 찾아야 겠지요.
...
...
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
디바이스 드라이버를 직접 구현하신다면...
디바이스 드라이버를 직접 구현하신다면...
http://lxr.linux.no/source/include/linux/fs.h#L1015
에서 있는
unsigned int (*poll) (struct file *, struct poll_table_struct *);
를 디바이스 드라이버에 구현 하셔야 합니다.
내용이 좀 되니... 유영창님이 쓰신 리눅스 디바이스 드라이버 책의 14장 입출력
다중화를 보셔야 할 것 같습니다.
select의 사용법이나 네트워크 프로그램에 대해서 좀 해 보시려면...
요사이 나온 김 선영님의 Advenced 리눅스 시스템 네트워크 프로그래밍을 참고 하시면
좋을 것 같습니다. 내용이 초보보다는 Advenced입니다. ^ ^;
아니시면 serial programming How to를 잠까 보시면 후반부에 잠깐 나오기도 합니다.
길게 설명 못 드려 죄송하네요.. 아는 바가 이것 뿐이라서...
예 감사합니다.
책을 구해서 참조해보겠습니다~
감사합니다.
댓글 달기