280 likes | 443 Views
System Programming. Project #1 Concepts. Assignment #1. 간단한 쉘을 구현하라 프롬프트를 나타내고 명령어를 받아들여 프로그램을 실행시키고 프로그램의 실행이 끝나면 다시 프롬프드가 명령어를 받아들이기를 반복하는 간단한 쉘 프로그램을 작성하라 . (Hint, fork, exec, wait 등의 system call 을 활용 )
E N D
System Programming Project #1 Concepts
Assignment #1 • 간단한 쉘을 구현하라 • 프롬프트를 나타내고 명령어를 받아들여 프로그램을 실행시키고 프로그램의 실행이 끝나면 다시 프롬프드가 명령어를 받아들이기를 반복하는 간단한 쉘 프로그램을 작성하라. (Hint, fork, exec, wait 등의 system call을 활용) • 쉘이 redirection (< , >) 기능을 제공하도록 하라. (Ex, a.out > a.result 라는 명령어는 a.out의 수행결과를 a.result라는 파일에 기록한다.) • 쉘이 pipe (|)의 기능을 제공하도록 작성한다. 이때 Unix의 FIFO 와 pipe를 사용하는 2가지 버전을 모두 구현하라. • 주의 : 쉘커맨드를 직접 사용하는 명령어를 사용하지 말 것! • Key concept • Fork • stdin/stdout • Redirection • Pipe
1-0. Program vs. Process • Program • 일련의 Instruction 집합 • Process • 메모리에 올라와 있는 program instance • OS 커널에서 스케줄링, 리소스의 관리의 단위 • 하나의 프로그램이 여러 개의 프로세스를 만들 수 있음 • 프로세스들끼리는 부모 자식 관계를 가짐
프로그램을 만들 때, • 한 프로그램에서 같은 작업을 동시에 수행시키고 싶을 때? • 예) 하나의 서버가 여러 명의 client를 처리할 때 • 한 프로그램에서 서로 다른 작업을 하고 싶을 때? • 예) 메뉴 기능을 수행하면서, 윈도우 화면에 애니메이션을 수행시키고 싶을 때
1-1. fork() fork() Process Process *. 자기 자신을 복제 *. 메모리 영역은 독립 *. PID 는 다름 *. 완전히 복제된 두 개의 Process 가 돌게 된다. Process’
pid = fork(); If(pid!=0) { /* section A */ } else { /* section B */ } • *. Parent Process • fork() 의 return value • 는 Child 의 process id pid = fork(); If(pid!=0) { /* section A */ } else { /* section B */ } pid = fork(); If(pid!=0) { /* section A */ } else { /* section B */ } *. Child Process -fork() 의 return value 는 0 -process id 가 0 이라는 뜻은 아님
1-2. exec() Process Fork() *. 완전히 새로운 Process ! *. 메모리 영역에 덮어 씌워짐 Process Exec() Process’ Process X
2-1. Stdin, Stdout (device) 눈에 보이는 도구들 컴퓨터*가 입출력 할 때 키보드 모니터 파일 다 똑같게 취급! *정확히는 OS 에서 이렇게 지원해 줌
2-2. Stdin, Stdout • stdin : Standard input • 보통의 경우, 키보드 • stdout : Standard output • 보통의 경우, 화면 • 따로 명시하지 않으면 기본적으로 입력과 출력은 Standard 를 따른다. • 파일처럼 읽고 쓸 수 있다 • File open->read or write->close
3. Shell? • The interface with the UNIX • 예) bash, csh, tcsh … • c.f.) GUI (Graphic User Interface) • stdin을 입력 받아 해석하고 수행시켜서 stdout으로 출력시켜줌 • 사용자가 수행시키는 프로세스의 부모 프로세스가 됨
4. Redirection • 출력과 입력을 수행할 대상을 바꾸어준다. • 표준 출력 장치인 모니터로 출력되는 결과를 파일에 출력한다거나 할 때 사용된다. • > : 왼쪽 명령의 수행문의 출력의 방향을 오른쪽에 명시되는 파일로 바꾼다. • < : 왼쪽 명령의 수행문의 입력을 오른쪽에 명시된 파일에서부터 받는다. • >> : >와 비슷하나 overwrite가 아닌 append를 수행한다. • Ex) 새로 파일을 만들지 않고 그 파일의 뒤에 내용을 덧붙인다.
5-1. Pipeline • 출력과 입력을 평소와 다르게 하는 것은 redirection과 비슷하나 장치를 바꾸는 것이 아니라 왼쪽의 결과를 오른쪽의 입력 Data로 한다는 것이 다르다. • Redirection을 사용할 경우 중간 과정으로서 파일 등을 생성해야 하는데 그렇지 않고 바로 원하는 결과를 얻을 수 있다는 것이다. • 파일이냐 프로그램이냐?
5-2 UNIX FIFO pipe • mkfifo • Create named pipes
5-3. Filter • 입력된 Data를 고유한 방법으로 조작하고 결과를 출력하는 프로그램 • wc(word count) : 입력의 줄, 단어, 문자를 센다. • sort : 입력을 정렬한다. • Filter들을 Pipeline과 Redirection으로 연결하여 다양한 조작을 할 수 있다.
추가내용 아담접속법과 컴파일 방법
1-1. Adam server • 전산과 실습용 서버 • Sun OS 5.9 • 개인 PC에 Linux 설치하거나VMWare를 깔아서 XP위에서 설치하는 방법도 있다. • 계정 발급은 과 사무실에 문의하시길 =)
2. compile • gcc filename.c • 실행파일 이름이 a.out으로 자동 지정됨 • gcc filename.c –o filename2 • 실행파일 이름이 filename2로 지정됨
3. 압축하는 방법 • 압축하기 : tar cvzf filename.tar.gz directory • 압축풀기 : tar xvzf filename.tar.gz
4-1. Makefile • 프로그램이 main.c, read.c, write.c로 구성되어 있고 모두 io.h라는 헤더파일을 사용한다. 실행파일의 이름은 test. • 이들을 각각 컴파일 하려면 • gcc –c main.c • gcc –c read.c • gcc –c write.c • gcc main.o read.o write.c –o test • 귀찮다!! -> Makefile 사용!!
4-2. Makefile – cont. • 파일이름은 Makefile • 컴파일 실행명령은 make • 현재 directory에서 makefile을 읽어서 컴파일 시킴 • 구조 • target : dependency command • command부분은 꼭 Tab으로 시작해야 함 • 만들어진 목적파일을 모두 삭제하는 명령어는 make clean
4-3. Makefile – cont. test : main.o read.o write.o gcc main.o read.o write.o -o test main.o : io.h main.c gcc -c main.c read.o : io.h read.c gcc -c read.c write.o: io.h write.c gcc -c write.c clean: rm –f *.o test