int wait(int *child_status)
child를 reaping하기 위해서 명시적으로 child가 종료할 때까지 기다리는 syscall
return : child의 pid 값
만약 int *child_status 가 null이 아니라면 문제가 발생한 것이다.
이때 여러개의 매크로를 통해서 어떤 문제가 발생했는지 알 수 있다.
위 코드에서 parent가 fork() 된 경우를 보자(else 부분)
wait(&child_status)를 통해서 child 가 종료될 때까지 기다리는 것을 볼 수 있다.
이 과정을 그래프로 나타내 보자
wait()를 통해서 parent는 child가 종료할 때까지 기다리고 CT 와 Bye를 차례로 출력하며 parent도 종료된다.
HC -> HP -> CT -> Bye (O)
HP -> CT -> Bye -> HC (X)
코드가 조금 복잡해 졌다.
N 만큼 for loop을 돌면서 fork()를 수행하고 있다. (N개의 child 생성)
child인 경우에는 바로 종료되는 코드이다.
parent인 경우에는 다시 N 만큼 for loop을 돌면서 N번의 wait()를 호출한다.
WIFEXITED(child_status) : 정상적인 종료이면 true를 return
WEXITSTATUS(child_status) : child가 exit할 때 가지고 있는 값(exit(100+i))
만약 child가 정상적으로 종료된다면 종료할 때 가지고 있는 exitstatus값을 출력하게 되므로 몇 번째 child가 종료되었는지를 출력으로 알 수 있다.
종료되는 child의 순서는 OS의 scheduling 알고리즘에 의해 결정되므로 예측하기 힘들다.
이번 코드는 wait() 대신 waitpid()라는 syscall을 통해서 child를 기다린다.
-> 특정 child의 종료를 대기할 수 있다.
-> 생성된 순서대로 reaping을 할 수 있다.
execve : child가 parent와 다른 프로그램을 수행하기 위해서 실행하는 syscall
child 의 PID는 유지한 채로 나머지 stack, data들이 모두 바뀐다.
호출은 되지만 return을 하지는 않는다. (호출된 함수로 다시 돌아감)
'CS > SystemSoftware' 카테고리의 다른 글
SystemSoftware - Cache Memory #2 (0) | 2021.06.06 |
---|---|
SystemSoftware - Cache Memory #1 (1) | 2021.06.06 |
SystemSoftware - Creating Processes #1 (0) | 2021.06.06 |
SystemSoftware - Exceptional Control Flow #2 (0) | 2021.06.05 |
SystemSoftware - Exceptional Control Flow #1 (0) | 2021.06.05 |