- 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이 이미 존재하면 : 원래 값이 새 값으로 바뀝니다. |
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 |
'시스템 프로그래밍' 카테고리의 다른 글
시스템 프로그래밍 6장 : Thread (0) | 2020.05.06 |
---|---|
시스템 프로그래밍 5장 - Process Control : Daemon (0) | 2020.05.05 |
시스템 프로그래밍 5장 - Process Control : PID (0) | 2020.05.05 |
시스템 프로그래밍 4장 - Current Process : Multitask - Pipe (0) | 2020.05.05 |
시스템 프로그래밍 4장 - Concurrent Process (0) | 2020.05.05 |