시스템 프로그래밍

[Shell lab] Trace 09, Trace 12

짱일모 2022. 11. 24. 02:42

Shell lab trace 09 번은 부모 프로세스 (tiny shell) 이 sigtstp 를 수신하면, foreground 로 실행중인 job 을 suspend 시키고 tshref 의 출력에 맞추는 문제입니다.

 

먼저 trace09.txt 파일을 확인해보겠습니다.

 

trace09.txt

./mytstpp 를 실행한 후 job 로 joblist를 출력하게 만들 것을 예상할 수 있습니다.

 

이번엔 mytstpp.c 파일을 열어보도록 하겠습니다.

 

trace08 에서 구현했던 것과 굉장히 유사한 구조

먼저 mytstpp는 trace08 에서 살펴보았던 그것과 굉장히 유사한 구조를 갖고 있습니다. 차이점은 parent process 에 sigtstp 시그널을 보낸다는 것입니다.

 

그렇다면 부모 프로세스에서는 sigtstp 를 수신하면 handler를 통해서 foreground job 을 stop 시키고, foreground 가 suspend되면 sigchld 가 수신될 것이므로 sigchld handler 에서 적절한 출력처리 및 job list 를 갱신해주어야합니다.

 

이를 구현한 코드는 다음과 같습니다.

 

trace 09 의 sigchld handler

Trace 08 의 sigchld 핸들러와 대조해서 살펴보자면 먼저 waitpid 의 옵션에 wnohang | wuntraced 가 들어갔습니다. WUNTRACED 는 suspend 된 자식 프로세스의 상태를 받는 옵션입니다. 

커널이 부모 프로세스에 sigchld 를 송신할 때는 자식 프로세스가 종료되거나, 자식 프로세스가 suspend 될 경우이므로 sigchld 핸들러는 종료된 자식 프로세스와 suspend 된 자식 프로세스 모두에 대해 handling 을 해주어야합니다. 따라서 or 을 이용해 wnohang (종료된 프로세스가 있으면 반환, 아니면 0 리턴 후 종료) 와 wuntraced (suspend된 자식이 있는 경우 리턴, 아니면 계속 부모 프로세스 정지 후 대기) 를 같이 써주어야합니다.

 

그리고 WIFSTOPPED(child_status)를 통해 suspend 된 자식이 있는 경우, job ~ ~ stopped by signal ~ 를 출력해주고, joblist에서 현재 job 을 꺼내와 job 의 state 를 stopped(ST)로 바꿔줘야합니다. 그래야 mytstpp 에서 jobs built-in 명령어를 호출했을 때 stopped process로 출력이 되기 때문입니다.

 

trace 12 는 자식 프로세스가 자기 자신에게 sigtstp를 송신했을 때 적절한 처리를 요구하는 문제입니다.

sigtstp가 발생하면 자식 프로세스는 suspend 되고 부모 프로세스에는 커널이 sigchld 를 송신합니다. trace 09에서 이미 sigchld handler 에 정지된 자식 프로세스에 대한 적절한 처리를 구현했으므로, 자동으로 통과됩니다.