`SIG_ERR` 매크로

SIG_ERR 매크로 (SIG_ERR)

신호(signal) 핸들러를 설치하는 signal 함수는 성공 여부를 포인터로 알려 줘요. 그런데 성공했을 때 돌아오는 값이 함수 포인터라서, '이게 진짜 함수 주소인지 아니면 에러인지'를 어떻게 구분할지 애매하죠. 그 애매함을 해결해 주는 표준 표식이 SIG_ERR이에요.

출처: cppreference

본문

매크로 정의

<signal.h>에 정의돼 있어요.

#define SIG_ERR /* implementation defined */

설명 (Explanation)

SIG_ERRvoid (*)(int) 타입의 값이에요. signal 함수가 이 값을 돌려줬다면 오류가 발생했음을 나타내요.

예제 (Example)

SIGTERM에 대한 핸들러를 설치하고, 그 반환값이 SIG_ERR인지 확인하는 전형적인 패턴이에요.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
 
void signal_handler(int sig)
{
    printf("Received signal: %d\n", sig);
}
 
int main(void)
{
    /* Install a signal handler. */
    if (signal(SIGTERM, signal_handler) == SIG_ERR)
    {
        printf("Error while installing a signal handler.\n");
        exit(EXIT_FAILURE);
    }
 
    printf("Sending signal: %d\n", SIGTERM);
    if (raise(SIGTERM) != 0)
    {
        printf("Error while raising the SIGTERM signal.\n");
        exit(EXIT_FAILURE);
    }
 
    printf("Exit main()\n");
    return EXIT_SUCCESS;
}

출력:

Sending signal: 15
Received signal: 15
Exit main()

같이 보기 (See also)

  • signal — 특정 신호에 대한 핸들러 설정
  • SIG_DFL/SIG_IGN — 신호 처리 전략 상수