KKanging

[운영체제] Process API in POSIX (기초) 본문

cs/운영체제

[운영체제] Process API in POSIX (기초)

천방지축 개발자 2024. 4. 29. 19:16

fork()

fork() 
return -> 자식은 0 부모는 자식의 프로세스 번호

window의 경우에는 프로그램과 이름이 같은 프로세스를 생성하지만

fork(posix)는 부모와 거의 동일한 프로세스를 생성한다.

부모 프로세스는 자식 프로세스의 pid를 받고

자식프로세스는 0을 받게 된다.

fork() 이후부터는 다른 실행 버전이 되게 된다.
자기 자신의 주소 공간, 레지스터등을 복사한 새 프로세스 생성

Deteministic 한 프로세스

위를 실행 해보면 바로 위와 같은 실행 결과가 나온다.

이는 예상하지 못하는 실행 결과가 나오므로

정해진 실행결과를 유도할 필요가 있다.

 

wait()

정해지는 작업을 위해

대체로 부모 프로세스는 자식 프로세스가 종료시까지 대기한다.

 

자식 프로세스가 정상적으로 종료 프로세스 ID - WIFEXITED(statloc) 매크로가 true를 반환
- 하위 8비트를 참조하여 자식 프로세스가 exit, _exit, _Exit에 넘겨준 인자값을 얻을 수 있음, WEXITSTATUS(statloc)    
자식 프로세스가 비정상적으로 종료 프로세스 ID - WIFSIGNALED(statloc) 매크로가 true를 반환
- 비정상 종료 이유를 WTERMSIG(statloc) 매크로를 사용하여 구할 수 있음    
wait 함수 오류 -1 - ECHILD : 호출자의 자식 프로세스가 없는 경우
- EINTR : 시스템 콜이 인터럽트 되었을 때    

exec() 계열 함수들

exec 계열 함수들은 프로세스 생성과는 거리가 멀다
대신에 호출을 하게 되면 지금 실행중인 프로세스에 메모리 영역을

매게 인자로 넘어온 filename 의 프로세스 상태로 대체한다

그리고 main 부터 실행하는데 main 의 char * arg[] 메게인자에 전달한 파라미터
값을 넘겨준다.

여기서 주의할 점은 프로세스 상태를 바꾸는 개념이라서 pid 나 그룹 pid fd 같은
것들은 변경 되지 않는 점을 유의 하자

int execl(const char *pathname, const char *arg0, ... /* (char *)0*/);
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, .../*(char *)0, char *const envp[] */);
int execve(const char *pathname,  char *const argv[], char *const envp[]);
int execlp(const char *filename, const c har *arg0, .../* (char *)0 */);
int execvp(const char *filename, char *const argv[]);

Redirection

 

file discription

파일 기술자를 제공한다.
012 는 std in out err

fork를 하면 child도 동일한 파일 기술자 테이블을 가진다.

값만 같지 주체는 다르게 된다 복사의 개념

이 예제는 파일 기술자를 안받는데 알고 있기 때문이다.

비어 있는 가장 작은 파일 기술자를 할당받게 되는데 위에서 1을 삭제 했기 때문에 
1을 할당 받게된다.