signal()에 구조체 전달

puresupe의 이미지

안녕하세요.
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의 쓰레드를 검색해본 결과

http://kldp.org/node/8930

에 저와 같은 질문의 쓰레드가 있었는데요

urmajest라는 분이

http://database.sarang.net/study/c/unix_c/21.htm#3

를 소개해주셧는데..

링크가 꺠져있어서 이렇게 글을 올립니다.

아. 참고로. 전역 구조체를 사용하진 않으려 합니다.

이것과 관련된 정보 가지고 계시는분을 기다립니다

꾸벅.

kukyakya의 이미지

깨진 링크는 http://web.archive.org 에 저장이 되어있네요.
http://web.archive.org/web/20061007003949/http://database.sarang.net/study/c/unix_c/21.htm#3

반응이 느린게 문제라면 epoll을 사용해보시는건 어떤가요?

puresupe의 이미지

코멘트가 늦었습니다. 파이어 폭스 켤 시간도 없었네요 :D

덕분에 좋은 글 읽을수 있었습니다. 그런데. 구조체와같은 데이터를 시그널 핸들러에
넘기는 방법에대해선 찾을수가 없었습니다.
아쉽지만. 결국 전역 포인터를 사용할 수 밖에없었습니다.

왠지는 알 수 없지만. SIGIO가 잘 작동 안한다는 느낌을 받았습니다.

IrDA를 사용하고 있는데요, Rx에 대해 시그널 핸들러가 호출되지 않을때가 있습니다.

시그널 핸들러가 호출되지 않는다는것은, SIGIO의 부재라고 생각을 합니다.

따라서. 어쩔 수 없이. SIGALRM을 사용해서. 일정 주기마다 핸들러를 실행시키게 해놓았습니다.

조언해주신 epoll도 좋을것같다는 생각이 듭니다.

epoll을 사용하는 것으로 한번 바꾸어 봐야겠네요.

감사합니다.