Process : is an instance of a running program.
(Not the same as "program" or "processor")
Process는 Two key abstractions을 제공 함.
Logical control flowPrivate virtual address space

ps : 현재 실행중인 process 출력

ps -elf : 현재 실행중인 모든 process 출력
init process의 PID는 항상 1




proc : kernel data interface를 위한 가상의 file system


2994/ -> bash process directory




(https://commons.wikimedia.org/wiki/File:Linux_Virtual_Memory_Layout_64bit.svg)

Process Table :
kernel은 어떤 프로세스가 현재 시스템에서 수행되고 있는지에 대한 정보가 필요. 그 정보를 갖고 있는 곳.
Each entry contains the following information about each process :

UNIX가 처음에 부팅될 때, 생기는 프로세스는 딱 하나이다. —> init process (PID = 1)
UNIX에서 프로세스를 만들 수 있는 유일한 방법은 기존의 프로세스를 복제(fork(2))하는 것.
fork()하면, PID, PPID를 제외하고 모든 것이 똑같다. (code, data, stack이 모두 똑같음)
우리가 원하는 것은 만들어진 process가 어떠한 program을 수행하기 원한다.
그래서 fork()로 생성된 child process의 code를
우리가 원하는 code로 바꿔주는 system call이
exec()계열의 system call들이다.

init는 getty라고 하는 process를 만듦.
getty process는 log-in promt를 동작시킴. (passwd 입력하라고 깜빡깜빡...)
이제 부팅, 로그인이 완료되었고 getty를 fork()/exec()를 통해 shell(bash)을 띄움.
bash(shell process)는 terminal의 console 입력부분에 커서를 깜빡깜빡..
실행파일의 이름을 입력하면, shell process는 자기 자신을 fork()한다.
fork()하여 만들어진 child process의 code 부분에
exec() system call을 사용하여
우리가 지정한 program의 code로 재할당.
shell process는 wait() system call을 통해
우리가 생성한 child process가 끝나기를 기다린다.
child process가 종료되면,
shell process가 wait하고 있다가
깨어나서 종료된 process에 대해서 뒷처리를 해주고,
그 다음 명령어를 입력할 수 있도록 shell prompt창에 다시 깜빡깜빡...

getpid : Get a process's IDgetppid : Get a parent process's IDfork : Duplicate a processexec : Replaces the code, data, and stack of a processexit : Terminate a process, parent process에 status code 전달wait : Waits for a child process






execve(2) : system callv는 vector 형태로 arguments를 넘겨준다는 의미.e는 environment variable을 넘겨주겠다는 의미.l은 list 형태로 arguments를 넘겨준다는 의미.p는 실행파일의 절대경로를 전달하는게 아니라, filename만 전달하고,PATH environment에서 찾도록 한다.


execve(2)에서 'v'는 vector형태로 arguments를 넘겨주는 방식인데,
execl(3)에서 'l'은 list형태로 arguments를 넘겨주는 방식이므로 아래와 같이 써야 함.

위에서는 -l 옵션(argv[2])이 execl의 argument 부분에 작성되지 않았으므로 동작되지 않음.
따라서 코드에서 execl()부분에 argv[2]까지 전달되도록 수정하면 될 것임.







Orphan process라고 한다.
Zombie process라고 한다.

위 경우에서, Child Process의 PPID가 1이 되는 상황이 발생한다...
왜 그럴까?
이는 parent process가 child process의 종료를 기다리지 않고 바로 종료했기 때문이다.
kernel의 process scheduling에 의해 child process가 먼저 실행되면 이러한 상황이 발생하지 않는데, parent process가 먼저 실행되어 종료된다면 위와 같은 상황이 발생한다.
즉, child process는 orphan process가 되었기 때문에 자동으로 PPID가 1로 할당된 것이다.
wait(2)로 parent process가 child process의 종료를 기다리도록 해결할 수 있다.

parent process가 child process의 상태가 바뀌기를(끝나기를) 기다림
parent process는 child process의 status return 0을 받음.
앞서, child process가 orphan process가 되었던 문제를 해결할 수 있다.
하지만 아래와 같이,
wait()는 종료 상태에 따라 다른 status code를 받게 되는데,
이를 해석하기 위해 bit masking을 해야 한다.
이를 편하게 해주는 macro가 WEXITSTATUS() 이다.

아래 예시와 같이,
child process에서 exit(1)을 하면,
Normal termination의 경우이므로 총 16bit 중 상위 8bit 자리에 1이 써지고,
이는 10진수로 256을 의미한다.
따라서 parent process에서 받은 status code를 bit masking 없이 그대로 출력하면, 의도와 달리 256이 출력된다.

따라서 원하는 1이라는 status code를 받기 위해서는
WEXITSTATUS() macro를 사용하여 상위 8bit 값을 masking할 수 있다.



Z: Zombie 상태라는 의미[07_zombie_process] <defunct>: 07_zombie_process가 zombie process이다.race condition :
Ubuntu에서는fflush :

execve()가 성공하면, 그 뒤에 있는 printf(), exit() 코드들은 실행되지 않는다.
execve()가 실패하면, 그 뒤에 있는 printf(), exit() 코드들은 실행된다.


