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
호출을 사용하여 프로세스가 종료 될 때 호출되어야하는 사용자 구현 함수 인 종료 핸들러를 등록하는 데 사용됩니다. atexit
는void (*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);
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