프로세스를 정상적으로 종료한다는 것은 무엇을 의미합니까?

프로세스를 정상적으로 종료한다는 것은 무엇을 의미합니까?

시험에서는 다음과 같이 밝혔습니다.

프로세스가 정상적으로 종료되는 두 가지 방법을 제공합니다. 차이점을 설명하세요.

무슨 뜻인가요?정상 종료?

답변1

이 맥락에서 사용되는 "정상적으로"라는 용어는 일반적으로 실행 프로세스가 신호에 의해 종료되거나 예기치 않게 충돌하지 않고 모든 명령을 성공적으로 완료할 때 종료된다는 것을 의미합니다. 예: Ctrl+C명령이 find실행 중이고 find프로세스가 신호를 받을 때 SIGINT적중됩니다 . 이 신호를 처리하는 것은 구현에 따라 다르지만 일반적으로 프로세스를 정상적으로 종료하는 것을 의미합니다. 프로그램이 정상적으로 종료되면 프로그램에서 마지막으로 실행된 문의 함수가 C성공적으로 반환될 때 발생합니다.main

이는 예를 들어 모든 명령을 완료하지 않고 비결정적 방식으로 종료되는 프로세스와 대조됩니다. 이는 프로그램 오류나 프로그램을 종료하라는 다른 프로세스 신호로 인해 발생할 수 있습니다. 비정상적인 종료는 일반적으로 x실행 중 일부 상태나 이벤트가 "정상"이 아님을 나타내는 일부 반환 값을 사용하여 하위 프로세스가 상위 프로세스로 중단/종료되는 등 프로그램에 구현된 논리 내에서 결정됩니다 . 예를 들어 프로세스가 SIGKILL신호를 수신합니다. 신호를 처리할 수 없으며 프로세스가 종료됩니다.

여기서 프로세스 추상화는 호출 프로세스(예: 셸)에 값을 반환하는 기능을 공유한다는 점에서 프로그래밍 기능과 유사합니다. 이러한 반환 값의 의미는 "성공" 또는 "실패" 호출의 조건을 정의합니다. 따라서 이 경우 이러한 의미를 정의하거나 사용하는 것은 프로그래머의 책임입니다.

구체적인 예를 들자면, 실행된 명령은 bash종료 시 결국 호출자에게 값을 반환합니다. 여기서, 이 이외의 값은 0명령이 비정상적으로 종료되었음을 나타냅니다. bash변수를 검사하여 $?마지막으로 실행된 문의 반환 값을 확인할 수 있습니다. 이 반환 값을 사용하면 존재하지 않는 파일을 읽지 못하도록 방지하는 등 스크립트의 실행 흐름을 제어할 때 유용합니다.

메모리에 할당된 주소 공간과 관련 리소스를 해제하고 작업의 CPU 스케줄링과 같이 프로세스 종료에 대해 이야기할 때 고려해야 할 다른 사항이 있지만 이는 또 다른 장입니다.

답변2

지금은 학교에서 무엇을 가르치는지 잘 모르겠지만,정상 종료"상태 0(제로)으로 종료"를 의미합니다.

(적어도 C 프로그램에서는) 이 작업을 수행하는 세 가지 방법을 생각할 수 있습니다.

return 0;   /* 1 */
exit(0);    /* 2 */
_exit(0);   /* 3 */

내 생각에 (1)과 (2)는 거의 동일하지만 (3)은 출력 버퍼를 플러시하지 않고 프로세스를 종료시킵니다. 포크/실행 상황에서 이를 사용하면 하위 프로세스가 종료되기 전에 버퍼링된 바이트(커널 또는 stdio를 통해)의 이중 출력을 방지할 수 있습니다.

답변3

프로세스를 종료하려면,신호그것으로 전송됩니다. 이러한 신호의 대부분에 대해 프로세스는 이러한 신호를 포착하고 일부 작업(네트워크 리소스 해제, 작별 인사 인쇄)을 수행하고 (대부분의 경우) 종료될 수 있습니다.

내가 설명한 것은 프로세스를 정상적으로 종료하는 방법입니다. 프로세스가 작업을 완료한 경우 또는 GUI 프로그램의 "x" 버튼을 사용하여 프로세스를 종료할 수도 있습니다. 하지만 유닉스 관련 사이트이기 때문에 그렇지는 않을 것 같습니다.

두 신호는 프로세스에 의해 포착될 수 없습니다.신호 살해그리고정지 신호. SIGKILL에 의한 종료는 비정상 종료로 간주됩니다.

정상 종료
killall -SIGHUP firefox
killall -SIGINT firefox

비정상적 종료
killall -SIGKILL firefox

관련 정보