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
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,