저번 시간에 함수 포인터에 대해서 언급을 했고, clockwise 해석법에 대해서도 간단하게 언급을 했으니, 다소 복잡한 것을 해석해 보도록 하겠습니다. C언어에는 signal 함수가 있는데요. 이것의 선언부만 간단하게 해석해 보도록 하겠습니다.

 간단해 보이진 않지만요. 사실 원래는, void (*signal(int,void (*)(int)))(int); 입니다.

 

 


  먼저, keyword를 찾아봅시다. signal입니다.

 

 

 그리고 큰 덩어리 하나 찾아봅시다. signal에서 시계 방향으로 돌기 시작했을 때 맨 먼저 만나는 '('과 쌍을 이루는 ')'을 찾아서, 표시를 해 주었는데요. 이 부분은 안쪽에서 해석을 해 보도록 하겠습니다.

 

 

 먼저, keyword인 signal에서, 오른쪽을 먼저 보니까 ()이 보였습니다. 이것은 함수임을 의미합니다. 그런데 어떤 함수인가요? 일단 인자가 있을 거고, 리턴 값이 있을 거에요. 그러면 인자들을 해석해 보겠습니다.

 

 

 블록 안쪽을 보니, sig와 handler가 있습니다. sig는 int형으로 선언되어있다는 것임은 쉽게 알 수 있고요. 2번째 인자인 handler부터 보도록 합시다. keyword가 handler이기 때문에, 이 친구를 기준으로 시계 방향으로 돌도록 하겠습니다. 봤더니 *가 나왔습니다. 그러면, 무언가를 가리킨다는 의미입니다.

 

 

 무엇을 point 할까요? int? long long? 배열? 따라가 보니 (int)라는 덩어리가 나옵니다. 이는, int형을 하나 받는 함수임을 의미합니다. 그런데, 리턴형이 없으면 의미가 없지 않을까요?

 

 보면, 선언을 할 때 void foo(); 이렇게는 쓸 수 있어도, foo(); 이렇게는 declear 할 수 없어요. 리턴 타입이 없기 때문이에요. 호출이랑 선언은 구분을 하셔야 합니다. 하튼. 제일 왼쪽에 어떤 형을 돌려주는지를 씁니다. 그러니, 리턴 타입은, 다시 시계 방향으로 돌려보면 있을 듯 싶습니다.

 

 봤더니, void 입니다. 즉, 이 함수는, 일단 int형과, int형을 인자로 받고, 아무것도 리턴하지 않는 함수 포인터를 인자로 받습니다.

 

 

 그러면, 어떠한 시그널이 발생했을 때, 포착을 했다면 foo 라는 함수를 호출하는 식으로 동작할 듯 싶네요.

 


 이 함수에 대해서 큰 덩어리까지만 해석했습니다. 이것은 signal 함수가 인자를 어떻게 받느냐에 대한 것이였습니다. 그러면 남은 부분은 무엇인가요? 바로 어떤 자료형을 돌려주느냐입니다. 일단, 쭉 돌려가면서 해석해 봅시다. *를 만났습니다. 그러면 포인터를 의미합니다.

 

 

 다음에 시계 방향으로 돌았더니, (와 )가 순서대로 나오고, 그 다음에 (int) 덩어리가 나왔습니다. 그러면 무엇을 의미하나요? int형 하나를 매개 변수로 가지는 function을 의미합니다. 그러면 function 또한 리턴 값이 있을 거에요.

 

 

 void 형이네요. 정리하면, 이것은, 함수를 가리키는 포인터를 리턴하는데요. 어떤 함수였나요? int형을 매개변수로 가지고, void를 리턴하는. 이것을 정리해 보겠습니다.