
Shell lab trace 09 번은 부모 프로세스 (tiny shell) 이 sigtstp 를 수신하면, foreground 로 실행중인 job 을 suspend 시키고 tshref 의 출력에 맞추는 문제입니다. 먼저 trace09.txt 파일을 확인해보겠습니다. ./mytstpp 를 실행한 후 job 로 joblist를 출력하게 만들 것을 예상할 수 있습니다. 이번엔 mytstpp.c 파일을 열어보도록 하겠습니다. 먼저 mytstpp는 trace08 에서 살펴보았던 그것과 굉장히 유사한 구조를 갖고 있습니다. 차이점은 parent process 에 sigtstp 시그널을 보낸다는 것입니다. 그렇다면 부모 프로세스에서는 sigtstp 를 수신하면 handler를 통해서 foreground job 을 ..

Shell lab Trace 08 은 부모 프로세스가 sigint 를 수신하면 foreground 로 실행 중인 job 을 종료하는 문제입니다. myintp 의 소스 코드를 열어보면 다음과 같습니다. /* * myintp.c - Sends a SIGINT to its parent (the shell) * * A correctly written shell will echo the SIGINT back to the child. */ #include #include #include #include #include #include "config.h" void sigalrm_handler() { exit(0); } int main() { signal(SIGALRM, sigalrm_handler); alarm(JO..

Shell이란 무엇인지 알아봅시다. 쉘(Shell)은 사용자의 명령을 처리해 주는 응용 프로그램입니다. 다음의 그림으로 쉘과 유저, 쉘과 커널의 관계에 대해 이해해봅시다. 즉 쉘을 통해서, 유저는 커널에 명령을 내리고 커널은 수행결과를 쉘을 통해 유저에게 보여주게 되는 것입니다. 조금 더 거시적인 관점에서 설명하면 하드웨어 커널 쉘 유저의 형태로 서로 communicate하는 것입니다. Shell의 종류로는 sh - Original Unix Bourne Shell, csh - BSD UNIX C Shell, tcsh - Enhanced C Shell, bash - Bourne-Again Shell이 있습니다. 앞으로 설명에서 사용될 Shell은 Bash Shell입니다. 쉘에서 처리할 수 있는 명령어는 ..

Trace07은 built-in 명령어 jobs를 구현하는 문제입니다. jobs 명령어는 현재 실행 중인 작업들의 리스트를 출력해주는 함수입니다. 실행 중인 작업들의 리스트를 출력해주는 함수는 tsh.c 내부에 listjobs()로 구현이 되어있습니다. 먼저 listjobs 함수를 살펴보겠습니다. void listjobs(struct job_t *jobs, int output_fd); 함수 헤더를 살펴보니 paremeter로 jobs배열과 file_descriptor 를 받는 것을 알 수 있습니다. 이미 글로벌 변수로 jobs를 선언해 준 것이 있으니 첫번째 인자로는 jobs를 넣어주면 될 것 같고 file descriptor는 원래 프로세스가 파일을 다룰 때 사용하는 추상적인 값이지만 어떤 파일을 다뤄..