SSE2033: System Software Experiment II (Fall 2018) Programming Assignment #3 Due : 15 th Nov. (Thur),5:59 PM 1. Introduction 이번과제에선리눅스환경을위한셸인 swsh 를제작한다. 이과제의주요목표는수업전반기 에배운주제인파일, 프로세스, 시그널, IPC 를다루는프로그램을제작하는것이다. 이번과제는여타과목의중간고사와비슷한비중을지닌다. 이과제를제출하지않으면큰불이 익을받을수있다. 2. Problem specification 셸은사용자의 1) 입력을받아, 2) 해석하고, 3) 명령을실행하는프로그램이다. swsh 은아주작은 기능만구현한셸로정해진특정명령어를실행시킬수있으며, input/output redirection, pipeline 기능을지원한다. 다음표는, 사용자의입력이될수있는문자열을 BNF(Backus-Naur Form) 와유사한형태로기술 한것이다. ( 이하, < 표 > 라고표현 ). input ::= commands commands input commands ::= command command < [filename] command > [filename] command >> [filename] command < [filename] > [filename] command ::= cmd_type1 [options/arguments] cmd_type2 [options/arguments] cmd_type3 [arguments] cmd_type4 cmd_type1 ::= { ls, man, grep, sort, awk, bc } path path ::= { pathname with leading "./" } cmd_type2 ::= { head, tail, cat, cp } cmd_type3 ::= { mv, rm, cd } cmd_type4 ::= { pwd, exit } < 표 > 에서사용한표현의일부는영단어그대로의의미로해석하면된다. 간단히설명하면, filename 은임의의 [ 파일명 ] 을뜻하고, options/arguments 는해당프로그램의 [ 옵션과인자 ]
를뜻하는표현이다. 그리고, < 표 > 에서사용된일부기호는 bash 에서쓰이는기호와동일하다. Pipeline < Input redirection > Output redirection >> Output redirection (appending) 각기호의기능은 Pipe 수업시간에서배운것과같고, 간략하게다시설명하면다음과같다. Pipeline: 앞프로세스의표준출력을뒤프로세스의표준입력으로파이프를통해연결 Input redirection: 해당프로세스의표준입력 (fd 0) 을 [ 파일명 ] 파일로대체 Output redirection: 해당프로세스의표준출력 (fd 1) 을 [ 파일명 ] 파일로대체 > 으로 redirect 되었을경우, 해당파일을초기화하고새로쓴다. >> 으로 redirect 되었을경우, 해당파일의뒤에서부터덧붙인다. 또한구현의편의를위해, < 표 > 의각키워드사이는무조건한칸의 space 로구분된다고가정한 다. 만약입력이 command < filename 의경우, [ 명령어 ] 와 < 문자사이엔한칸의 space, < 와 [ 파일이름 ] 사이에도한칸의 space 로구성된다. 2.1. Interpreting inputs 사용자는 200바이트이내의문자열을입력한다. 만약사용자의입력이 < 표 > 의 input으로부터도출 (derive) 할수있는문자열이면, 유효한입력이다. 예를들면, 다음명령의경우, cd dir3 input commands command cmd_type3 [arguments] cmd_type3 cd [arguments] dir3 순으로해석될수있기때문에유효한입력이다. 다음명령또한 input 으로부터유도될수있기때문에유효하다. ls al /etc sort r > ls_sorted.txt 하지만다음명령은, less 라는프로그램을 input 으로부터유도할수없기때문에유효하지않다.
ls al /etc less < 표 > 의 path 경우, 셸에서현재디렉토리내의프로그램을실행하는것을의미하는표현이다. 현재디렉토리의 a.out 파일을실행시킨땐통상적으로다음명령을사용한다../a.out 즉, [ 명령어 ] 가 "./" 로시작하는문자열 ( 경로 ) 일경우 cmd_type1 에서유도될수있다고본다. ( 과제의단순화를위해, 절대경로등의방식은고려하지않는다. 또한, 홈디렉토리를의미하는 ~ 또한사용하지않는다.) 입력이유효할경우입력을평가하고, 유효하지않은경우다음과같은에러메시지를표준에러 (fd 2) 에출력한다. swsh: Command not found 2.2. Evaluating inputs 입력값을평가하는과정을구현하는방식은사람마다다르겠지만, 일반적으로다음과같은방식을취할수있다. 1) 명령어의개수를파악 (pipeline 등으로명령어들이연결된경우 ) ( 각명령에대해 ) 2) Input/output redirection이사용되었는지파악 3) 명령어종류를분석하여, A. 직접구현한경우, ( 필요하다면 ) 자식프로세스를생성하여해당루틴을호출 B. 구현하지않은경우, 자식프로세스를생성하여해당프로그램을로드하여실행 4) 자식프로세스를생성했을경우, 종료될때까지기다림 2.2.1. Input/output redirection 셸의명령으로 redirection이사용될경우, 사용자가명시한파일이존재하는지, 혹은존재하더라도해당파일이정상적인파일인지 ( 디렉토리가아닌지 ), 해당파일을사용할권한이있는지등을확인할필요가있다. 하지만, swsh에선아래다음과같은경우만파악한다. 만약 input redirection 으로명시된파일이파일이존재한다면, 무조건읽기권한이있는정상적인 파일이고, 존재하지않으면다음과같은문자열을출력한다.
명령이파이프로연결되었다고생각하자. A B C D Input redirection 는제일앞의 A 프로세스에서만존재할수있고, output redirection 는제일뒤의 D 프로세스에서만존재할수있다. (B 와 C 에서 redirection 이존재하는지검사할필요가없음 ) A < file1 B C D > file2 2.2.2. command swsh에서처리할명령은크게 4가지종류로구분된다. 간단히설명하자면, cmd_type1: 해당프로그램을로드 (fork - exec*) 해서실행해야하는프로그램 cmd_type2: 로드하거나, 구현할지선택할수있는프로그램 cmd_type3: 구현해야하는프로그램 ( 인자가있음 ) cmd_type4: 구현해야하는프로그램 ( 인자가없음 ) cmd_type1 에해당하는명령은, 옵션이나인자를추출해자식프로세스를생성해 exec계열함수를통해해당바이너리를로드하여실행한다. cmd_type2 의경우, 스스로구현하던지이미존재하는 exec를통해실행할지선택할수있다. 당연히, 직접구현한경우높은평가를받는다. 직접구현하더라도, 파이프등을통해서다른프로세스와연결될수있다는점을고려한다. cmd_type3 와 cmd_type4 에해당하는명령은직접구현해야한다. 구현해야하는명령에대해선아래 3 장에서각명령의기능을정의하고필요한시스템콜 / 라이브 러리함수를언급할것이다. 2.3. Process group swsh가새로운자식프로세스를생성할경우, 해당프로세스를새로운 process group에속하도록한다. ( 해당자식프로세스의 pgid는자기 pid와일치하도록만든다 ) 만약, 파이프의사용으로인해두개이상의프로세스를생성할경우, 모든프로세스는제일먼저생성한프로세스의그룹에속하도록한다. ( 프로세스의 pgid는제일먼저생성한자식프로세스의 pid와일치해야함 ) 2.4. Reaping child processes swsh 가자식프로세스를생성했다면, wait 계열시스템콜를이용해자식프로세스를확인하고 제거하여좀비프로세스가생기지않도록한다.
프로세스가실행도중 Ctrl+Z 키를통해생성하는 SIGTSTP 시그널을수신하면, 일반적인경우프로세스실행을멈추고중단된다. 동시에부모프로세스는 SIGCHLD 시그널을수신하고, 이때부모가다음과같이 waitpid 를호출해서얻는 status 값에 WIFSTOPPED 매크로함수를실행하면 true가반환된다. (waitpid 시스템콜의옵션 WUNTRACED) waitpid(-1, &status, WNOHANG WUNTRACED) ( 참고 : $ man 2 waitpid) 만약자식프로세스가중지되었을경우 (WIFSTOPPPED 가 true 일때 ), 해당자식이속한프로세스 그룹에 SIGKILL 시그널을보내모든연관프로세스를강제로종료시킨다. 2.5. Signals swsh 는 SIGINT, SIGTSTP 시그널을수신해도종료되지않는다. 3. Programs 구현할프로그램은기존프로그램과동일한작업을수행하지만, 쉽게구현할수있도록단순화된 버전이다. 3.1. head head [OPTION] file file 파일의위에서부터 10 라인을표준출력으로출력한다. -n K 10 라인대신 K 라인을출력한다. file 파일이존재하지않는경우는없다. 3.2. tail tail [OPTION] file file 파일의아래에서부터 10 라인을표준출력으로출력한다. -n K 10 라인대신 K 라인을출력한다.
file 파일이존재하지않는경우는없다. 3.3. cat cat file file 파일을표준출력으로출력한다. file 파일이존재하지않는경우는없다. 3.4. cp cp file1 file2 file1 파일의복사본 file2 파일을만든다. file1 파일이존재하지않는경우는없다. file2 파일을덮어쓸수없는경우는없다. 3.5. mv mv file1 file2 file1 파일의이름을 file2로바꾼다. rename(2) 3.6. rm rm file file 파일을삭제한다. unlink(2) 3.7. cd cd dir 현재 working directory를 dir로변경한다.
chdir(2) 3.8. pwd pwd 현재 working directory를표준출력으로출력한다. getcwd(3) 3.9. exit exit [NUM] 표준에러로 exit란문자열을출력한뒤, swsh를종료한다. NUM이명시되었을경우프로그램의종료값으로 NUM을, 아닐경우 0을반환한다. exit(3) 3.10. Errors mv, rm, cd 명령수행중에러가발생한경우, 에러의종류에따라아래표에명시된메시지를 다음과같이조합하여표준에러로출력한다. EACCESS EISDIR ENOENT ENOTDIR EPERM Permission denied Is a directory No such file or directory Not a directory Permission denied Other errors Error occurred: <ERRNO> ( 에러번호출력 ) command: ERROR_MESSAGE e.g.) mv: Permission denied cd: Not a directory 4. Background 4.1. strace 어떤프로그램을실행할때발생하는시스템콜을추적하는프로그램이다. 간단히,
$ strace ls 명령을수행하면, ls 명령을실행하기위해사용된시스템콜의내역을볼수있다. 또한, -p 옵션을사용하면, 현재실행중인프로세스의시스템콜을확인할수있다. bash에서, 현재자신의 pid를보는명령은 echo $$ 이다. 새로운셸을띄워, 이렇게확인한 bash 프로세스의 pid를 strace p 옵션으로넘길경우, 셸을동작시키기위해사용되는시스템콜을확인할수있다. 4.2. whereis // which 어떤파일의위치를알고싶을때, whereis 나 which 명령을사용할수있다. $ which ls /bin/ls 5. Restrictions 과제구현을위해여태까지배운리눅스시스템콜 / 라이브러리함수를이용한다. 어떤자원을동적으로할당받았다면, 프로그램종료전에반드시해제해야한다. 여기서자원이란파일, 메모리, 자식프로세스를뜻한다. 6. Hand in instruction 작성한코드상단의주석에이름과학번을작성한다. make 명령을통해프로그램이제대로만들어지는지확인한다. 제출한코드가컴파일되지않을경우, 경우에따라서해당제출은채점되지않거나심한페널티를받게될것이다. 프로그램코드를 " 학번.tar.gz" 형태로압축한다. 본과제수행시구현방법과디자인을설명하는보고서를 PDF 포맷으로작성하여 " 학번.pdf" 이란이름을붙인다 7. Logistics 본과제는혼자수행한다. 과제제출시간은메일도착시간을기준으로하며, 과제를지연제출하면기한직후엔 10% 가감점되고, 매 24시간마다 10% 씩추가로감점된다. Copy 할경우, 연구실자체규정에따라처벌하며, 상당한불이익이있을수있다. Have fun!
컴퓨터시스템연구실