C에서 exit 기능 사용

Jinku Hu 2023년10월12일
  1. exit기능을 사용하여 C에서 프로세스 종료
  2. atexit함수를 사용하여 C에서 종료 핸들러 등록
C에서 exit 기능 사용

이 기사에서는 C에서exit기능을 사용하는 방법에 대한 여러 방법을 보여줍니다.

exit기능을 사용하여 C에서 프로세스 종료

주어진 프로그램이 UNIX 기반 운영 체제에서 실행될 때이를 프로세스라고합니다. 프로세스는 오래 실행되는 데몬 스타일 프로그램이나 간단한 명령 줄 유틸리티 일 수 있지만 결국 둘 다 언젠가 종료 지점에 도달합니다. 종료는 일부 오류/전달 된 신호로 인해 비정상적으로 발생하거나exit라이브러리 함수를 호출하여 프로세스 자체가 정상 동작으로 정상적으로 종료 될 수 있습니다. 부모 프로세스에 반환되는 종료 값을 지정하는 단일 정수 인수를 사용합니다. exit함수는 호출 프로세스에서 리턴되지 않습니다.

exit함수는 시스템 호출_exit(다음 단락에서 논의 할 것임) 위에 구축 된 표준 라이브러리 함수입니다. 그러나 호출자를 종료 지점으로 안내하는 것보다 더 많은 작업을 수행합니다. 즉,exit는 종료 핸들러가 호출되고 표준 I/O 스트림 버퍼가 플러시 된 후_exit가 호출 될 때 등록 된 함수와 같은 프로그램에 대한 일부 정리 루틴을 수행합니다. _exit는 UNIX 특정 시스템 호출 인 반면exit는 표준 C 라이브러리의 일부이며 다른 플랫폼에서 사용할 수 있습니다.

다음 예제는EXIT_SUCCESS상태 매개 변수를 사용하는exit함수 호출을 보여줍니다. 이는 일반적으로 성공적인 리턴을 표시하는0값의 매크로 상수입니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  // Execute program code here

  printf("Executing the program...\n");
  sleep(5);

  //    exit(0);
  exit(EXIT_SUCCESS);
}

출력:

Executing the program...

atexit함수를 사용하여 C에서 종료 핸들러 등록

atexit함수는exit호출을 사용하여 프로세스가 종료 될 때 호출되어야하는 사용자 구현 함수 인 종료 핸들러를 등록하는 데 사용됩니다. atexitvoid (*function)(void)유형의 함수 포인터를 유일한 인수로 취합니다.

여러 개의atexit호출을 통해 여러 기능을 등록 할 수 있으며,이 경우 등록의 역순으로 지정된 기능이 실행됩니다. atexit는 호출이 실패하면 0이 아닌 값을 반환합니다. 프로세스가 외부 신호에 의해 비정상적으로 종료되면 등록 된 함수가 호출되지 않을 수 있습니다. 다음 예제 코드는 종료 핸들러로 등록 할 두 개의정적함수를 구현하고 5 초의 휴면 후 프로세스는exit호출로 종료됩니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void atexitFunc(void) { printf("atexitFunc called\n"); }

static void atexitFunc2(void) { printf("atexitFunc2 called\n"); }

int main(int argc, char *argv[]) {
  if (atexit(atexitFunc) != 0) {
    perror("atexit");
    exit(EXIT_FAILURE);
  }

  if (atexit(atexitFunc2) != 0) {
    perror("atexit");
    exit(EXIT_FAILURE);
  }

  printf("Executing the program...\n");
  sleep(5);

  exit(EXIT_SUCCESS);
}

출력:

Executing the program...
atexitFunc2 called
atexitFunc called

atexitFunc2가 먼저 호출 된 다음atexitFunc가 호출됩니다. 또는 프로세스를 즉시 종료하는_exit시스템 호출을 호출하여이 프로그램을 직접 종료 할 수 있습니다. 하지만atexit에 등록 된 함수는 호출되지 않습니다. 반대로_exit는 열린 파일 설명자를 닫습니다. 이로 인해 프로세스가 종료되기 전에 알 수없는 지연이 발생할 수 있습니다. 또한 원하는 상태 값과 함께return문을 사용하여exit기능이 제공하는 것과 유사한 종료 동작을 유발할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void atexitFunc(void) { printf("atexitFunc called\n"); }

static void atexitFunc2(void) { printf("atexitFunc2 called\n"); }

int main(int argc, char *argv[]) {
  if (atexit(atexitFunc) != 0) {
    perror("atexit");
    exit(EXIT_FAILURE);
  }

  if (atexit(atexitFunc2) != 0) {
    perror("atexit");
    exit(EXIT_FAILURE);
  }

  printf("Executing the program...\n");
  sleep(5);

  _exit(EXIT_SUCCESS);
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C Process