언어 자료구조 알고리즘/C11 표준 라이브러리 함수

abort 함수[C언어 표준 라이브러리 함수 가이드]

언제나휴일 2016. 1. 3. 15:44
반응형

abort


헤더 파일

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - stdlib.h


void abort(void); SIGABRT 시그널을 발생하는 함수
 
입력 매개 변수 리스트
없음
반환 값
없음
 
abrot 함수는 SIGABRT 시그널을 발생하는 함수로 raise(SIGABRT)와 같은 역할을 수행합니다.
SIGABRT는 프로세스가 비정상적인 상태에 도달했을 때 강제로 프로세스를 종료하기 위한 시그널입니다.
만약 프로그램에 SIGABRT 시그널 핸들러를 등록하면 다른 방식으로 처리할 수 있습니다.
참고로 Microsoft Visual C에서는 abort 함수를 호출하면 SIGABRT 시그널을 발생하는 것 외에도 오류 창을 띄웁니다.
만약 abort 함수를 호출할 때 SIGABRT 시그널만 발생하고 오류 창을 뜨지 않게 하려면 _set_abort_behavior( 0, _WRITE_ABORT_MSG);를 호출합니다.
 
다음의 예제 코드에서는 _set_abort_behavior( 0, _WRITE_ABORT_MSG);를 호출하여 abort 함수 호출 시 오류 창이 뜨는 것을 방지하였습니다.
그리고 초기에 SIGABRT 시그널 핸들러를 등록한 후 abort 함수를 두 번 호출합니다.
그리고 SIGABRT 시그널 핸들러에서는 발생한 시그널이 SIGABRT일 때 디폴트 시그널 핸들러로 설정합니다.
따라서 실제 실행하면 첫번째 SIGABRT 시그널이 발생하면 등록한 시그널 핸들러가 동작하지만 두번째 SIGABRT 시그널이 발생하면 디폴트 행위가 동작합니다.
SIGABRT 시그널의 디폴트 행위는 프로세스 강제 종료입니다.
 
사용 예
//C언어 표준 라이브러리 함수 사용법 가이드
//void abort(void); SIGABRT 시그널을 발생하는 함수
//SIGABRT 시그널 핸들러를 등록하고 프로그램 방식으로 SIGARBT 시그널 발생
 
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void MySigHandler(int signo);
void Test();
int main(void)
{   
     _set_abort_behavior( 0, _WRITE_ABORT_MSG);//abort 함수 호출하였을 때 오류 창 뜨지 않게 설정
    signal(SIGABRT,MySigHandler);//SIGABRT 시그널 핸들러 등록   
    Test();//테스트
    return 0;
}
 
void MySigHandler(int signo)
{
    printf("%d signal 발생\n",signo);
    if(signo == SIGABRT)//발생한 시그널이 SIGABRT일 때
    {
        signal(SIGABRT,SIG_DFL);//SIGABRT 시그널 핸들러를 디폴트로 설정
    }
}
void Test()
{
    printf("Test 1\n");//테스트 용
    abort();//SIGABRT 발생 raise(SIGABRT); 와 같음
    printf("Test 2\n");//테스트 용
    abort();//SIGABRT 발생 raise(SIGABRT); 와 같음
    printf("Test 2\n");//테스트 용
}
 
출력
Test 1
22 signal 발생



사용한 함수

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - printf

반응형