signal()에 구조체 전달
글쓴이: puresupe / 작성시간: 금, 2009/08/07 - 11:50오후
안녕하세요.
IrDA를 이용한 소켓 프로그래밍을 하고있습니다.
IrDA는 센서인지라.. Asynchronous I/O가 필요하게되었습니다.
원래는 select()를 사용하다가, select()는 Synchronous I/O에 속하기때문에.
반응이 느려서. 시그널 방식을 사용하려고합니다.
소켓 디스크립터에대해서
fcntl(sd,F_SETOWN,getpid());
ioctl(sd,FIOASYNC,&arg);
와 같은 방식으로 SIGIO를 발생시키게 해놓았습니다.
signal(SIGIO,handler); 와 같이 SIGIO시 호출될 함수를 등록하였구요..
이떄 handler에는 구조체가 하나 넘어가야합니다 ㅠㅠ
KLDP의 쓰레드를 검색해본 결과
에 저와 같은 질문의 쓰레드가 있었는데요
urmajest라는 분이
http://database.sarang.net/study/c/unix_c/21.htm#3
를 소개해주셧는데..
링크가 꺠져있어서 이렇게 글을 올립니다.
아. 참고로. 전역 구조체를 사용하진 않으려 합니다.
이것과 관련된 정보 가지고 계시는분을 기다립니다
꾸벅.
Forums:
깨진 링크는
깨진 링크는 http://web.archive.org 에 저장이 되어있네요.
http://web.archive.org/web/20061007003949/http://database.sarang.net/study/c/unix_c/21.htm#3
반응이 느린게 문제라면 epoll을 사용해보시는건 어떤가요?
코멘트가
코멘트가 늦었습니다. 파이어 폭스 켤 시간도 없었네요 :D
덕분에 좋은 글 읽을수 있었습니다. 그런데. 구조체와같은 데이터를 시그널 핸들러에
넘기는 방법에대해선 찾을수가 없었습니다.
아쉽지만. 결국 전역 포인터를 사용할 수 밖에없었습니다.
왠지는 알 수 없지만. SIGIO가 잘 작동 안한다는 느낌을 받았습니다.
IrDA를 사용하고 있는데요, Rx에 대해 시그널 핸들러가 호출되지 않을때가 있습니다.
시그널 핸들러가 호출되지 않는다는것은, SIGIO의 부재라고 생각을 합니다.
따라서. 어쩔 수 없이. SIGALRM을 사용해서. 일정 주기마다 핸들러를 실행시키게 해놓았습니다.
조언해주신 epoll도 좋을것같다는 생각이 듭니다.
epoll을 사용하는 것으로 한번 바꾸어 봐야겠네요.
감사합니다.
댓글 달기