종료(시스템 호출)

exit (system call)

많은 컴퓨터 운영 체제에서 컴퓨터 프로세스는 시스템 종료 호출을 통해 실행을 종료한다. 보다 일반적으로 멀티스레딩 환경에서 출구는 실행 스레드의 실행이 중지되었음을 의미한다. 리소스 관리를 위해 운영 체제는 프로세스에서 사용하던 리소스(메모리, 파일 등)를 회수한다. 이 과정은 종료된 후 죽은 과정이라고 한다.

작동 방식

UnixUnix유사한 운영 체제에서는 상위 프로세스포크 시스템 호출을 실행할 때 프로세스가 시작된다. 부모 프로세스는 자식 프로세스가 종료될 때까지 기다리거나 실행을 계속할 수 있다(아마도 다른 자식 프로세스를 중지할 것임). 자식 프로세스가 정상적으로 종료("디즈")되거나 치명적인 예외신호(예: SIGTERM, SIGINT, SIGKILL)로 인해 비정상적으로 종료되는 경우, 종료 상태는 운영 체제에 반환되고 SIGCLD 신호는 상위 프로세스에 전송된다. 그러면 종료 상태는 대기 시스템 호출을 통해 상위 프로세스에 의해 검색될 수 있다.

대부분의 운영 체제는 종료 프로세스가 시스템에 특정 종료 상태를 제공하는 것을 허용하며, 이는 상위 프로세스에서 사용할 수 있게 한다. 일부 운영 체제(예: Bell Labs의 Plan 9)에서는 문자열을 반환할 수 있지만 일반적으로 이 값은 정수 값이다. 정수 값을 반환하는 시스템은 일반적으로 0 값을 사용하여 성공적인 실행을 나타내고 0이 아닌 값을 사용하여 오류 조건을 표시한다. 다른 시스템(예: OpenVMS)에서는 성공을 위해 짝수 값을 사용하고 오류에는 홀수 값을 사용한다. 여전히 다른 시스템(예: IBM z/OS 및 이전 버전)은 성공, 경고 및 오류 완료 결과를 나타내기 위해 정수 값의 범위를 사용한다.

정리하다

종료 연산은 일반적으로 제어권을 운영체제로 되돌리기 전에 프로세스 공간 내에서 정리 연산을 수행한다. 일부 시스템과 프로그래밍 언어는 사용자 서브루틴을 등록하여 프로세스가 실제로 영구적으로 종료되기 전에 프로그램 종료 시 호출되도록 한다. 종료의 마지막 단계로서, 원시 시스템 종료 호출을 호출하여 프로세스가 종료되었음을 운영 체제에 알리고, 이 과정에서 사용되는 자원을 회수할 수 있도록 한다.

때때로 일반적인 정리를 우회하는 것이 가능하다; C99는 다음과 같이 C99가 제공한다. _exit() 별도의 프로그램 정리 없이 현재 프로세스를 종료하는 기능. 예를 들어, 포크 실행 루틴에서 다음과 같은 경우에 사용될 수 있다. exec 호출이 하위 프로세스를 대체하지 못함, 호출 atexit 루틴은 부모에 속한 리소스를 잘못 릴리스할 수 있다.

고아와 좀비

일부 운영 체제는 상위 프로세스가 종료된 하위 프로세스를 특별한 방식으로 처리한다. 그러한 고아 과정은 특별한 뿌리 과정의 자녀가 되고, 그 후 아동 과정이 종료되기를 기다린다. 마찬가지로 좀비 프로세스를 다룰 때도 비슷한 전략이 사용되는데, 좀비 프로세스는 종료되었지만 부모 프로세스에 의해 종료 상태가 무시되는 하위 프로세스다. 그러한 과정은 특별한 부모 과정의 자녀가 되는데, 이것은 아이의 출구 상태를 검색하고 운영체제가 죽은 프로세스의 종료를 완료할 수 있게 한다. 이러한 특수한 경우를 다루면 시스템 프로세스 테이블이 일관된 상태로 유지된다.

다음 프로그램은 종료하고 성공 종료 상태를 시스템에 반환한다.

C:
#include <stdlib.h>  인트로 본래의(공허하게 하다) {     퇴장하다(EXIT_SUPTION); /* 또는 반품 EXIT_SUPTION */ } 
C++:
#include <cstdlib>  인트로 본래의() {     찌꺼기::퇴장하다(EXIT_SUPTION); // 또는 반품 EXIT_SUPTION } 

COBOL:

 식별 나누기.  프로그램-ID. 성공-프로그램.    절차 나누기.  메인.      이동   반환 코드.   프로그램. 

포트란:

 프로그램 위키       퇴장을 명하다(0)  프로그램을 끝내다 위키 

Java:

공중의 계급 성공 {     공중의 정태의 공허하게 하다 본래의([] 아그)     {         시스템.퇴장하다(0);     } } 

파스칼:

프로그램 위키; 시작되다         종료코드 := 0;         퇴장하다 종지부를 찍다. 

PC DOS 배치 파일:

0번 출구 

:

#!/usr/bin/env perl 퇴장하다; 

PHP:

<?php 퇴장하다(0); 

Python:

#!/usr/bin/env python3 수입하다 sys sys.퇴장하다(0) 

Unix 셸:

퇴장하다 0 

PC DOS 어셈블리:

; MASM/TASM .MODEL SLOG의 경우.Stack .CODE 메인 PROCE MOV AH, 4CH; Service 4CH - Error Code MOV AL, 0; 오류 코드 INT 21h; Interrupt 21h - DOS General Interrupts 메인 End 메인 End 메인 ; 메인에서 시작 

일부 프로그래머는 INT 21h를 위해 모든 것을 한 번에 준비할 수 있다.

    MOV AX, 4C00h; HEX의 오류 코드로 00 교체 

Linux 32비트 x86 어셈블리:

; NASM MOV AL의 경우, 1 ; 기능 1: exit() MOV EBX, 0; Return code INT 80h; # 제어권을 전달하여 벡터 #를 인터럽트하는 시스템 호출—이 경우 시스템 호출 #1 인수가 0인 경우 
# GAS .text .global _start: movl $1, %eax # 시스템 호출 번호 1: exit() movl $0, %ebx # 종료 상태 0 in $0x80 # 시스템 호출인터럽트하기 위해 제어 전달 - 이 경우 시스템 호출 번호 1(인수 0) 

Linux 64비트 x86 64 어셈블리: FASM용

 형식을 갖추다 엘프64 실행 가능한 3    입장권 출발하다    분절하다 읽을 수 있는 실행 가능한    시작:      ; SUPT      ; 나가는 중      영화를 찍다 이삭스, 60  ; sys_syscall 번호: 60      xor 에디, 에디 ; 종료 상태를 0으로 설정("xor edi, edi"는 "mov edi, 0"과 동일함)      syscall      ; 그만둬라리다 

OS X 64비트 x86 64 어셈블리: NASM용

  전지구적 _주요  단면 .text  _main:      영화를 찍다 왁스, 0x02000001     ; sys_exit syscall 번호: 1(OS X의 경우 0x02000000 추가)      xor rdi, rdi            ; 종료 상태를 0으로 설정("xor rdi, rdi"는 "mov rdi, 0"과 동일함)      syscall        ; 호출구 

창문들

Windows에서 프로그램은 ExitProcess 또는 RtlExitUserProcess 함수를 호출하여 스스로 종료할 수 있다.

참고 항목

참조

외부 링크