프로세스 다루기

한지용·2021년 4월 15일
0

Operating System

목록 보기
7/7
post-thumbnail

프로세스를 생성하고 종료하는 시스템 호출/표준 라이브 함수

함수의미
fork자신과 완전히 동일한 프로세스를 생성한다
exec 계열지정한 실행 파일로부터 프로세스를 생성한다
exit종료에 따른 상태 값을 부모 프로세스에게 전달하며 프로세스를 종료한다
atexitexit로 프로세스를 종료할 때 수행할 함수를 등록한다
_exitatexit로 등록한 함수를 호출하지 않고 프로세스를 종료한다

프로세스 생성
fork, exec

프로세스 종료
exit,atexit,_exit

fork

pid_t fork(void);

return: fork 호출이 성공하여 자식 프로세스가 만들어지면 부모 프로세스에서는 자식 프로세스의 프로세스 ID가 반환되고 자식 프로세스에서는 0을 반환한다. fork 호출이 실패하여 자식 프로세스가 만들어지지 않으면 부모 프로세스에서는 -1이 반환된다.

  • 부모(parent) 프로세스와 자식(child) 프로세스
    fork를 호출하여 새로운 프로세스를 생성할 때, fork를 호출하는 쪽을 부모 프로세스라고 하고 새로 생성된 쪽을 자식 프로세스라고 한다.
  • 부모 프로세스와 자식 프로세스는 서로 다른 프로세스이다
    프로세스 식별번호(PID)가 서로 다르다.
    자식 프로세스의 부모 프로세스 식별 번호(PPID)는 자신을 생성한 부모 프로세스가 된다
  • 자식 프로세스는 부모 프로세스가 fork를 호출하던 시점의 상태를 그대로 물려받는다
    - 프로그램코드
    • 프로그램 변수에 저장되어 있는 데이터 값
    • 하드웨어 레지스터의 값
    • 프로그램 스택의 값 등등
  • fork 호출 이후에 부모와 자식 프로세스는 자신들의 나머지 프로그램 코드를 수행한다.

exec 계열

int execl(const char path, const char arg, ...);
int execlp(const char file, const char arg, ...);
int execv(const char path, char const argv[]);
int execvp(const char file, char const argv[]);

path: 실행 파일의 경로로 상대 경로와 절대 경로 모두 사용할 수 있다.
file: 경로 이름이 아닌 실행 파일의 이름이다.
return: 호출이 성공하면 호출하는 프로세스에서는 반환값을 받을 수 없다, 만약 함수 호출 후 -1이 반환되면 이는 함수 호출이 실패했음을 의미한다.
arg: path나 file로 지정한 실행 파일을 실행할 때 필요한 명령어 라인의 옵션과 인자이다. 한 개 이상을 지정할 수 있으며 마지막 인자는 반드시 NULL 포인터로 지정해야 한다.
argv: arg와 같은 의미를 가지나 문자형 포인터의 배열로 형태가 다르다. 배열의 마지막은 NULL 문자열로 끝나야 한다.

  • exec 계열은 크게 두가지 계열로 나눌 수 있다.
    p가 있는것과 없는 것, l이 있는것과 없는것
    p가 없는 것: 실행하고 싶은 파일명을 꼭 절대경로나 상대경로로 전달해야 한다
    ex) "ls" 함수를 사용하고 싶다면 \bin\ls -> ls 함수의 경로명 함께 작성
    p가 있는 것: 실행파일 이름만 전달하면 된다

l 과 v
실행에 필요한 매개변수 전달 방법의 차이

  • v는 매개변수를 집합으로 만들어서 줘야한다
  • l은 매개변수를 직접 나열 가능
    두 함수 모두 마지막에는 마지막 매개변수라는 의미 전달을 위해 null"(char *)0"을 함께 전달해야한다

exec는 부모,자식 용어 대신 호출, 피호출이라는 용어를 사용한다

호출 프로세스( caller process )
- exec를 실행하는 프로세스
피호출 프로세스( callee process )
- exec에 의해 생성되는 프로세스

exec를 성공적으로 호출한 결과

  • 호출 프로세스는 종료된다.
  • 호출 프로세스의 메모리 영역을 피호출 프로세스가 차지한다
  • 호출프로세스의 PID를 피호출 프로세스가 물려받는다

fork vs exec

Fork
자신과 동일한 자식 프로세스만 생성할 수 있다.
다른 종류의 프로세스를 생성할 수 없다.
자식 프로세스를 생성하더라도 자신은 종료되지 않는다.
exec
자신과 다른 종류의 프로세스를 생성할 수 있다.
새로운 프로세스를 생성하면 자신은 종료된다.

exit

프로세스를 종료하면서 부모 프로세스에게 종료와 관련된 상태 값을 넘겨준다

void exit(int status);
status: 부모 프로세스에게 전달되는 상태값으로 0~255(1byte)의 값이 사용된다
return: 없음

exit는 프로세스를 의도적으로 종료시킨다.
이외에 프로세스가 종료하는 경우는

  • 더 이상 수행할 문장이 없거나
  • main 함수 내에서 return문을 수행할 때이다.

status의 값은 0~255 사이의 값으로 각각에 대한 정해진 의미가 없다.

  • 프로그램 작성자가 임의로 정해서 사용한다.

atexit

프로세스가 exit를 호출하여 종료할 때 수행되는 함수들을 등록한다.

int atexit(void (*function)(void));
function: atexit로 등록할 함수의 이름이다
return: 호출이 성공하면 0을 반환하고, 실패하면 0이 아닌 값을 반환한다.

function

  • 함수의 이름으로 함수는 void function(void); 형으로 정의되어야 한다.

종료 시 마무리 작업 (clean-up-action)

  • 프로세스가 종료할 때 깔끔한 마무리를 위해 수행해야 하는 작업들
  • 최대 32개까지 등록할 수 있다. (실제 실행 순서는 등록 순서의 역순)

_exit

exit 함수와 같지만 clean-up-action을 수행하지 않는다

void _exit(int status);

status: 부모 프로세스에게 전달되는 상태값으로 0~255(1byte)의 값이 사용된다
return: 없음

0개의 댓글