Process의 생성
fork 시스템 호출
#include <sys/types.h>
#Include <unistd.h>
pid_t fork(void);
- 수행되던 process(parent)의 복사본 process(child) 생성
- fork() 바로 다음 문장부터 동시에 실행
두 프로세스의 차이점
- pid와 ppid가 다르다.
- fork()의 return 값이 다르다.
- parent process : child process의 pid
- child process : 0
- fork 실패 시 -1 return
- 시스템 전체 process의 수 제한
- 한 process가 생성할 수 있는 process 수 제한
fork : 파일과 자료
child process는 parent process의 복제.
- 모든 변수 값이 그대로 복제된다.
- fork()후에 변경된 값은 복제되지 않는다.
- file descriptor도 복제된다. (parent process가 open한 file은 child process에게도 open)
- parent와 child가 file을 공통으로 사용 가능
exit 시스템 호출
사용법
#include <stdlib.h>
void exit(int status);
- exit : process 정지 -> open된 file 닫기 -> clean-up-action
exec을 이용하여 새 프로그램을 수행
사용법
#include <unistd.h>
int execl(const char *path, const char *arg0, ... ,const char *argn, (char *)0);
int execlp(const char *file, const char *arg0, ... , const char *argn, (Char *)0);
int execv(const car *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
공통점
- 호출 프로세스의 주기억장치 공간에 새로운 프로그램을 적재
- 호출 프로세스는 no longer exists
- 새 process는 처음부터 실행
- 새 process는 호출 프로세스의 id로 실행
- 실패 시 -1 return. 성공 시 return이 없다.
- fork와의 차이점 : 기존 프로세스와 병렬 수행이 아니다.
차이점
- path : 파일의 경로 이름 포함 vs file : 파일 이름
- 인수
- arg0 : 프로그램 이름(경로 제외) and arg1 ... argn : 프로그램에 입력으로 사용될 인수들. 마지막엔 null pointer
- argv[] : 배열로 받기
- file 이름을 쓰는 경우는? = 환경 변수에 의해 설정된 path안의 file
프로세스의 동기화
wait 시스템 호출
#include <sys/wait.h>
#include <sys/types.h>
pid_t wait(int *status);
- 하나 이상의 child process 수행 시 아무나 하나가 종료되면 return
- child process가 종료될 때 까지 기다린다. parent process는 blocked 상태
- return 값 : 종료된 child의 id or -1(살아있는 child process가 없는 경우)
- status : child의 종료 상태가 전달
parent가 child의 종료상태를 확인했을 때 process table에서 삭제한다. parent에서 wait를 하지 않으면, child를 종료하지 못한채 프로세스 테이블을 채우고 있다.
프로세스 종료 검사
child가 parent에게 전달하는 값이 status의 상위 8bit에 저장된다.
- WIFEXITED(status) : status의 하위 8bit가 0인지 검사 = 정상종료인지 검사
- WEXiTSTATUS(status) : status의 상위 비트에 저장된 값을 return
waitpid 시스템 호출
#include <sys/types.h>
#include <sys/wiat.h>
pid_t waitpid(pid_t pid, int *status, int options);
- pid 기다리고 싶은 chlid의 id
- status : child의 종료 상태
- options : WNOHANG - child가 종료하지 않았으면 0을 return
Zombie와 너무 이른 퇴장
- 부모 프로세스가 wait를 수행하지 않고 있는 상태에서 자식이 퇴장할 때 = child는 zombie가 된다.
- 하나 이상의 자식 프로세스가 수행되고 있는 상태에서 부모가 퇴장할 때 = child는 init의 child로 남는다.