void (*signal(int signo,void (*func)(int)))(int);
이것을 해석하면,
<integer형을 인자로 하고 return값이 없으며 (integer 하나), (integer를 인자로 하고 리턴값이 없는 handler라는 이름의 함수포인터 하나)를 인자로 하는 signal이라는 이름의 함수포인터 >
가 되는군요.
이게 사실이라면, signal은 변수이기 때문에 prototype이 맞는 경우 다른 함수를 가르킬 수도 있을 것입니다.
또한 함수포인터이므로 애초 signal.h에 signal이라는 함수를 assign하는 동작이 들어 있어야 하는데 그런 것도 않 보입니다.
이런 두가지 이유로 signal이라는 것은 함수포인터가 아닌 함수로 보이는데 분명히 선언을 보면 함수포인터로 되어 있습니다.
도대체 signal함수는 왜 함수포인터 형태로 선언되어 있을까요?
도무지 모르겠습니다. 고수님들의 현명한 조언을 기대합니다. ^^;
======================================================================================================
1. signal 함수 선언의 뜻은?
void (*signal(int signo,void (*func)(int)))(int);
예제를 void (*a)(int), a= signal(int signo, void (*handler)(int)) 두개로 나누어 봅시다.
그러면 a는 함수의 리턴벨류를 의미하며 <integer형을 argument로 하고 return 값이 없는 함수 포인터 a> 라 할수 있습니다.
근데 signal이란 놈은 <integer 하나, integer를 인자로 하고 리턴값이 없는 handler라는 이름의 함수 포인터 하나를 인자로 하는 signal이라는 이름의 함수>입니다.
이 둘을 결합하면 결국,
a = <integer형을 인자로 하고 return값이 없는 함수포인터를 리턴값으로 가지며 (integer 하나), (integer를 인자로 하고 리턴값이 없는 handler라는 이름의 함수포인터 하나)를 인자로 하는 signal이라는 이름의 함수 >입니다.
2. signal을 가르키는 함수 포인터 선언은?
위와 같이 선언자체와 리턴 값을 둘로 나누어 봅시다.
void (*) (int) -> return value;
(* signal)(int, void (*) (int)); -> return value를 제외한 함수 포인터
둘을 합하면
void (* (* signal)(int, void (*) (int)) ) (int)
와 같이 됩니다.
이것은 signal과 같은 함수를 가르킬 수 있는 함수 포인터입니다.
------------------------------------------------------------------------------------
그동안 제가 미처 모르던 부분이 아주 명확하게 이해가 되었습니다.
제가 착각했던 부분은 함수에서 함수포인터가 리턴값이 되었을 때의 선언방식이 일반 변수를 선언했을때의 그것과 다르다는 점 이었습니다.
여지껏 써왔던 함수라는 것이 함수포인터를 리턴하는 경우가 없어서 그점까지 고려하지 못했는데 상우님을 비롯한 고수님들의 친절한 조언으로 더이상 헷갈릴 일 없이 이해하게 되어 더없이 기쁘고 또 감사드립니다.
부디 행복하시고 늘 행운이 함께 하시기를 바랍니다.
출처 : http://kldp.org/node/43211
'QnA' 카테고리의 다른 글
데몬을 제작해야 하는데요.. (0) | 2009.07.28 |
---|---|
ifconfig, 혹은 route 에 해당하는 내부함수가 있는지요. (0) | 2009.07.28 |
cat /dev/null > a.txt 2>&1 (0) | 2009.07.27 |
Re: rs_init() (0) | 2009.07.26 |
/dev/ttyS, "Input/output error" (0) | 2009.07.18 |
WRITTEN BY
- RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.