2017-11-28 1 views
1

우리는이 교과서에서 신호가 처리된다는 사실을 제외하고 설명이 부족한 코드가 있음을 알게되었습니다. C 신호 코드 설명 필요

#include <signal.h> 
void (*signal(int signr, 
      void(*sighandler)(int) 
     ) 
    )(int) 

나는 sighandler 함수에 대한 포인터 것을 알고 있지만, 실제로 실행하거나 반환되는 경우 이해가 안 돼요?

(int)으로 전화를하면 어떻게됩니까? 반전 된 캐스트와 거의 흡사합니다.

+3

[cdecl 규칙 (https://cdecl.org/?q= void + % 28 * 신호 % 28int % 2C + void % 28 * % 29 % 28int % 29 % 29 % 29 % 28int % 29) –

답변

4

이것은 signal 함수의 서명입니다.

첫 번째 인수 signrint 유형이며 처리기를 변경하려는 신호입니다.

두 번째 인수 sighandlervoid (*)(int) 유형의 함수 포인터, 즉 int을 가져와 void을 반환하는 함수 포인터입니다. 이 매개 변수는 신호를 처리 할 함수의 이름입니다.

이 함수는 이전 신호 처리 함수를 가리키는 유형 void (*)(int) (인수 2와 동일한 유형)의 함수 포인터를 반환합니다.

것은 아래로 속보 :

signal         // signal 
signal()        // is a function 
signal(int)       // taking a int 
signal(int, void (*)(int))    // and a function pointer 
             // which takes an int and return void 
(*signal)(int, void (*)(int))(int)  // and returns a function pointer 
             // which takes an int 
void (*signal)(int, void (*)(int))(int) // and returns void 

남자 페이지를 만드는 형식 정의가 포함이 더 명확 조금 :

typedef void (*sighandler_t)(int); 

sighandler_t signal(int signum, sighandler_t handler);