12 - (3) fork(), execve(), exit(), wait()

2018. 11. 20. 15:45임베디드sw공학

1, Process Management System Calls

 1) getpid

 2) getppid

 3) fork

 4) exec :

 5) exit

 6) wait :

 

2, getpid(2), getppid(2)

#include <sys/types.h>

#include <unistd.h>

 

pid_t getpid(void);

 

pid_t getppid(void);

 

반환되는 것은 고유한 양수이다.

몇몇은 프로세스의 아이디는 항상 같은 것을 받게 된다. ex) init <- ' 1 '

 

 

3, fork(2)

 

#include <unistd.h>

 

pid_t fork(void);

 

새로운 프로세스를 만들기 위해서, 부모 프로세스를 복제하는 것이다. 코드는 같지만, PID, PPID는 다르다.

명령어가 성공한다면, 반환되는 것은 2개 이다. parent process가 반환받는 것child process의 PID이다. child process는 0을 받게 된다.

실패한다면, parent process는 -1 을 받게 된다.

 

 

1) fork()는 인자를 받지 않는다. parent process와 child process는 동시에 수행된다.

2) 생성된 자식 프로세스는 어떠한 것이 먼저 실행될지는 알 수 없다.(우선순위를 정하지 않는다면.)

 

4, exec(3) family - 새로운 코드로 바꿔치기 하는 것.

#include <unistd.h>

 

중요한 것은

int execve(const char *pathname, char * const argvp[], char* const envp[]);

 

const char* pathname : 수행하고 싶은 파일의 이름을 적는다.

char* const argvp[] : 프로그램의 인자를 전달 해준다.

char *const envp[] : 프로그램을 실행할 떄 필요한 환경변수를 준다.

 

1) 나머지는 execve() 시스템 콜의 기능을 추가하여, 만들어 낸 것.

2) 함수명에 'v'가 붙은 것은 인자(argument)들을 벡터로 전달하는 함수 이다.

3) ' l ' 은 인자를 하나하나 순서대로 리스트로 적어주는 것이다.

4) 'e' 환경변수를 넘겨주는 것이다.

5) 'p' 는 지정된 곳에 filename을 넘겨 주는 것이다.

 

- execve(2) 의 예 

 

5, exit(3), atexit(3) - 프로세스를 정상적으로 종료시킬 떄 사용.

 

#include <stdlib.h>

 

void exit(int status); <- 정상 종료

int atexit(void (*function) void);

 

1) child process가 끝날때, parent에게 SIGCHLD 시그널을 보낸다.

2) atexit()는 exit하기 전에 함수를 호출해 준다. cleanup과 같다.

 

6, wait(2), waitpid(2)

#incude <sys/types.h>

#include <sys/wait.h>

 

pid_t wait(int *status);

 

pid_t waitpid(pid_t pid, );

 

1) wait()는 child process가 exit()로 실행을 마쳤다면, status를 받는다.

2) waitpid()는 어떠한 특정 child process의 상태값을 option을 설정함으써, child process가 종료되어지지 않은 채 작업 중이여도 status를 받을 수 있다.

 

 

 

 

7, Orphan process

: parent process가 wait하지 않고 먼저 종료되어 버린 것.

이 경우는 child process는 init process에 입양되어진다. 자식 프로세스가 종료되면 상태값은 init process에 반환되어진다.

 

8, Zombie process

child process가 exit(status)로 종료를 하려 하였지만, parent process가 wait()명령어를 쓰지 않고 다른 일을 작업중일 때, 정상적으로 child process는 종료되어지지 않는다. 이 경우 정상적으로 종료되어지지 않은 child process를 좀비 프로세스라 한다.

 

'임베디드sw공학' 카테고리의 다른 글

9.시그널  (0) 2018.11.27
12 -(2) process create  (0) 2018.11.20
12-(1) Process 의 개요.  (0) 2018.11.20
7. 리눅스시스템 프로그래밍: File I/O  (0) 2018.11.06