DEVOPS/LINUX

[Linux] 프로그램 실행 시작, 종료

연듀 2021. 12. 4. 15:32

프로그램 실행 시작

 

exec 시스템을 호출하여 디스크에 있는 실행파일을 주기억장치로 올려 실행시킨다.

c 시작 루틴에 명령 줄 인수와 환경 변수 두가지 정보를 전달하고 프로그램을 실행시킨다.

 

c 컴파일러가 프로그램을 컴파일 할 때 메인 함수 말고 별도의 코드를 추가한다.

이것을 c start-up routine이라고 한다.

여기서 exec에서 받은 인자를 가지고 main 함수를 호출한다.

 

 

 

프로그램 종료

 

프로그램 종료는 정상 종료, 비정상 종료로 나누는데 이것은 커널의 입장에서 논한다.

 

 

정상 종료

main() 실행을 마치고 리턴하면 C 시작 루틴은 이 리턴값을 가지고 exit()을 호출
프로그램 내에서 직접 스스로 exit()을 호출
 
비정상 종료
exit을 부르지 않고 종료하는 것(ex-kill)
시그널에 의한 종료

 

=>프로세스를 주기억장치에 올려 놓은 다음 명령 줄 인수, 환경 변수를 C시작 루틴에게 넘김

C 시작 루틴이 시작되어 main 함수를 부르고 실행이 끝나면 다시 c시작 루틴에서 종료

 

 

 

 

커널에서 프로세스를 실행 시킬려면 디스크에서 읽어온 다음에 주기억장치에서 exec에 의해 적재한다.

C start-up 루틴에서 main을 실행한다.

함수들을 호출하고, 가장 정상적인 케이스로는 c start-up 루틴으로 돌아온다. 그리고 exit을 부른다.

아니면 main 함수내에서 사용자가 의도를 가지고 exit을 부를 수도 있다. 

exit에서는 standard I/O cleanup을 한다. atexit으로 등록한 함수들을 차례로 불러주고 돌아온다.

이러한 과정을 뒷정리라고 한다.

그리곤 _exit을 불러 커널로 돌아간다. 결국 프로세스가 종료되는 마지막 시스템콜은 _exit이다.