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