Hi there!

I am a student studying computer science.

시스템 프로그래밍

시스템 프로그래밍 5장 - Process Control : Process Start & Exit

만능성구 2020. 5. 5. 19:06
728x90
  • exec system call
    • Pass command line arguments and environment variables to the C startup routine
    • Run the program.
  • C start-up routine
    • Passing command-line arguments and environment variables while calling the main function

- Program source code를 작성한 이후 gcc로 실행 파일을 만들어낸다.

- command라인에서 실행파일을 실행한다.

- kernel에서 해당 실행파일의 이름을 exec를 호출해서 실행한다.

- 이후의 typing이 있을 경우 argument로 해당 실행 program에 전달한다.

- exec가 사용자 process를 생성한다.

- 사용자 process의 argument를 main함수의 argument로 전달해서 실행한다.

Command line arguments / environment variables

int main(int argc, char *argv[]);
argc : 명령줄 인수의 개수
argv[] : 명령줄 인수 리스트를 나타내는 포인터 배열

argument 수 만큼 array를 만들어서 실행이 된다.

argument는 command line

environment variables이란?

해당 process가 실행되는 shell에서 기본적으로 설정되어 있는 값

- 기본적으로 program내에서 환경변수로 그 값을 이용해서 작업을 할 수 있다.

- user가 누구인가? logname이 무엇인가? 현재 home dir가 누구인가? path가 어디인가? Mail뭔가?

- 이런 환경변수를 program내에서 사용할 수 있다.

Environment

#include <stdlib.h>

char *getenv(const char *name);
환경변수를 가져올 수 있는 system call api
name : 가져올 환경 변수 이름 // HOME, PATH.. 등
return 해당 환경 변수 값 / NULL
#include <stdlib.h>

int putenv(const char *name);

name을 환경 변수 list에 넣어준다.

name : 환경변수의 이름 

return 0 / -1
#include <stdlib.h>

int setenv(const char *name, const char *value, int rewrite);

 

환경변수를 설정하는 system call

name : 환경변수의 이름 

value : 설정할 환경변수 값

rewrite :

- 0이 아니고 name이 이미 존재하면 : 원래 값이 새 값으로 바뀝니다. 
- 0 : 이면 그대로 유지됩니다.

return 0 / -1

환경변수는 <stdlib.h>에 들어있는 정보이다.

그 정보를 가져오기 위해서는 #include해주어야한다.

전역변수를 통해서 전체적으로 직접적으로 접근할 수 있다.


Process Termination

프로그램 종료 방식

  • Normal termination 정상 종료
    • 해당 process를 실행한 process가 자체적으로 종료하는 것.
    • main(..) return , eixt(..)호출
  • Abnormal termination 비정상 종료
    • Session leader process, group process, parent process와 같은 다른 process로부터 signal을 받고 종료하는 것.
    • abort(..), SIGABRT라는 signal을 받고 종료된다.

정상종료 중에서 exit(..)종류

#include <stdlib.h>

void exit(int status);
//After rearranging, the process ends normally.

뒷정리하고 종료

모든 open된 stream을 정상적으로 닫고 출력 buffer의 내용을 disk에 fflush(..)로 쓰고 정상적으로 종료

종료code가 존재할 경우 부모 process에게 전달

 
 
#include <stdlib.h>

void _exit(int status);
//Immediately terminate the process without rearranging.

뒷정리를 하지 않고 종료

open된 stream이 있어도 바로 종료

 

OverView

커널은 c start up routine이 실행되고 main이 실행되고 user function 과 c start-up사이 오가며 소통

*_exit 정리하지 않는다

* exit streram descriptor 등을 정리하고 종료. 특별히 다른 process에서 처리해야될 경우 exit에 전달해서 다른 process가 처리한다. 그리고 다시 _exit호출한다.

 

어떤 process가 exit를 통해서 종료될 때 자신이 종료될 때 수행되야하는 어떤 함수를 만들어서 정리하고 싶은면 exit handler에서 실행되도록 만들어 줄 수 있다.

#include <stdlib.h>

int atexit(void (*func)(void));
argument를 exit로 종료될 때 kernel에서 exit handler가 부모 process에서 실행되게 할 함수를 만들어서 등록하는 함수 system call

func : exit되고 실행될 함수

return 0 / nonzero

 

728x90