signal함수에 대한 질문..
글쓴이: shs0917 / 작성시간: 금, 2004/04/30 - 2:32오후
요즘 어드밴스트 유닉스 프로그래밍 책을 혼자 공부중인데요..
signal 함수에 대해서 이해가 잘 가지 않아서 질문을 올려봅니다.
#include <signal.h> void (*signal (int signo, void (*func) (int)) ) (int);
그리고 이 원형을 좀 더 쉽게 하기 위해서..
typedef void Sigfunc(int); Sigfunc *signal (int, Sigfunc *);
이렇게 되어 있는데요.. typedef해서 void 자리에 저렇게 바꾸면서
해봐도.. 함수가 저렇게 변하는게 이해가 잘 안되요.. :oops:
제가 C언어에 너무 미숙해서 그런거 같은데.. 이게 첫번째 질문입니다.
축약형 원형에서 첫번째 매개변수는 시그널 번호, 두번째 매개변수는
시그널 핸들러.. 이렇게 이해했는데 맞나요?
그리고
signal(SIGINT, SIG_IGN) 이렇게 하면 리턴값은 뭐가 리턴이 되나요?
이게 저의 궁금증입니다..
Forums:
Re:
첫번째 아규먼트는 시그널 번호, 두번째는 해당 시그널 핸들러...인게 맞습니다.
signal() 함수의 맨 페이지에는 sighandler_t 라는것이 리턴값이라고 되어 있구요,
실제로 리턴되는 값은 해당 시그널 번호의 현재 시그널 핸들러..라고 되어 있습니다.
그리고 sighandler_t 는 signal.h 에 정의에 의하면,
라고 되어 있습니다.
즉, signal() 의 리턴값은 int 형의 아규먼트 하나를 받고,
리턴값이 void 인 함수인 셈이죠.
void (*signal (int signo, void (*func) (int)) ) (int);
이게 한줄로 표현된 전체군요;;
추가:
signal(SIGINT, SIG_IGN); 의 리턴값은 SIGINT 의 기본 핸들러가 리턴될텐데,
man 페이지 7 번 섹션의 signal 을 보면은 SIGINT 의 디폴트 핸들러의 동작은
Term, 즉 현재 프로세스를 종료하는 것이라고 되어 있네요.
그 코드를 담은 함수의 어드레스...가 아닐까 싶네요.
Re: signal함수에 대한 질문..
void (*signal (int signo, void (*func) (int)) ) (int);
signal이라는 함수는...
* 첫번째 인자: int 형 정수
*두번째 인자: void를 리턴하고 int형 인자를 받는 함수의 포인터를 의미합니다.
* 리턴형: void (* )(int) 라는것을 의미합니다...
즉, 리턴형은 void형을 리턴하고 int형인자를 받는 함수의 포인터입니다.
(아시겠지만... signal함수의 리턴형은 이전 시그널핸들러의 주소값입니다.)
당연히 SIG_IGN을 두번째 인수로 주더라도 리턴형은 함수의 포인터입니다.
그리고 저렇에 정의하는게 보기 약간 불편하니까 typedef를 사용하는것입니다
쓰고보니 질문에서 다 언급하신 내용인것같네요..ㅋ
도움이 되셨기를 바라며...
댓글 달기