과제 1 : 기본이해 제출일 : 4월 10일 ( 목 ) 까지 과제내용» 연습문제풀이 1 1.6 2 2.8 3 3.8» 프로그래밍과제 4 $ ftp 211.119.245.75 (id: anonymous, passwd: 자기loginID) 또는 (id: ftp, passwd:ftp) 한다음 # cd pub 하고 # get p.c 하여 p 프로그램의 version 2와 3을작성하시오. Version 1: p 프로그램에서페이지출력후응답에서! 와쉘명령을입력하면 ( 예,!ls l), 해당쉘명령을실행하고나서 p 프로그램이계속수행되도록수정 Version 2: 페이지당줄수를명령줄에명시하여변수 pagesize에지정되도록수정, ( 실행예 ) $ p 10 p.c Version 3: 키보드입력값이 b 이면이전의입력부분을재출력하는기능을추가 5 $ tail n filename (default n=10) 작성 6 표준입력으로부터명령을한줄읽어프로그램이름과매개변수로나누고 fork() 를이용하여입력된명령을실행시키는매우단순한형태의쉘을 C 언어로작성하라. 단순한쉘은명령줄로부터입력된모든매개변수들을명령으로전달하여실행시키고명령이끝날때까지기다리도록구현한다. 문법오류를조사하는파싱은하지않아도좋다. exit 또는 Control-D를입력하면쉘에서빠져나오도록구현한다. 매개변수의최대개수는적절하게제한해도좋다. ( 힌트 : Unix 완성, 10장, Background Processing 참조 ) OS Homework 1.1
과제 1 : 기본이해 과제제출방법» 과제 1 & 2: Electronic version 모두제출 2 Electronic versions:» csblade.incheon.ac.kr (211.119.245.149) 의지정디렉토리 /export/home/homework/2008oshw.ab 에자기학번의디렉토리만들고그곳에소스파일과실행파일복사» csmail.incheon.ac.kr (211.119.245.75) 지정디렉토리 /home/homework/2008oshw.ab 에자기학번의디렉토리만들고그곳에소스파일과실행파일복사 선행작업» Linux 명령익히기 : http://marvel.incheon.ac.kr/ Information Linux 기본적인쉘명령어모음참조» vi 편집기익히기» Linux 환경에서 C 언어프로그래밍익히기 (gcc, gdb) 참고문헌» Graham Glass and King Ables, UNIX for Programmers and Users, 2 nd Ed., Prentice Hall PTR, 1999. UNIX for Programmers and Users 프로그래머와 ( 사용자를위한 UNIX 완성 ), Glass and Ables 저, 조경산역, 이한출판사, 2001.» 한동훈, 이만용역 (Neil Mattew, Richard Stones 원저 ), 초보자용리눅스프로그래밍 (Beginning Linux Programming), 대림, 1998.» 기타 Linux 참고서적 OS Homework 1.2
(C 언어보충 ) Command-line Arguments Command $ myecho hello world Output hello, world argc 와 argv[]» argc=3» argv[0]: echo» argv[1]: hello» argv[2]: world Source code $ cat myecho.c #include <stdio.h> main(int argc, char *argv[]) int i; for (i = 1; i < argc; i++) printf( %s%s, argv[i], (i < argc-1)? : ); printf( \n ); return 0; argv: 0 myecho\0 hello\0 world\0 OS Homework 1.3
(C 언어보충 ) argv 처리: optional flag myecho2.c ( 숫자 option 처리 ) $ cat myecho2.c #include <stdio.h> main(int argc, char *argv[]) int i; for(i=1; i<argc; i++) printf("%s%s", argv[i], (i<argc-1)? " : ""); if(argv[i][0] == '-') printf( ( 제곱값은 %d) ", (atoi(argv[i]))*(atoi(argv[i]))); printf("\n"); return 0; OS Homework 1.4
(C 언어보충 ) argv 처리: optional flag myfind -n -x pattern $ cat myfind.c #include <stdio.h> #include <string.h> #define MAXLINE 1000 int getline(char *line, int max); /*find /find : print lines that match pattern from 1st arg */ main(int argc, char *argv[]) char line[maxline]; long lineno = 0; int c, except =0, number =0, found =0; while(--argc > 0 && (*++argv)[0] == '-') while(c = *++argv[0]) switch(c) case 'x': except = 1; break; case 'n': number = 1; break; default: printf("find : illegal optin %c\n",c); argc = 0; found = -1; break; if(argc!= 1) printf("usage : find -x -n patttern\n"); else while(getline(line, MAXLINE) > 0) lineno++; if((strstr(line, *argv)!= NULL )!= except) if(number) printf("%ld:", lineno); printf("%s\n", line); found++; return found; int getline(char s[], int lim) int c, i; for (i=0; i<lim-1 && (c=getchar())!=eof && c!='\n'; ++i) s[i] = c; if (c == '\n') s[i] = '\0'; ++i; s[i] = '\0'; return i; OS Homework 1.5
(C 언어보충 ) fork + exec 후면처리 (background processing) $ cat background.c #include <stdio.h> main (argc, argv) int argc; char* argv []; if(fork()==0)/* () Child */ execvp (argv[1], &argv[1]); /* Execute other program */ fprintf (stderr, "Could not execute %s\n", argv[1]); OS Homework 1.6
fork 시스템호출 printf( One\n ); pid = fork(); PC A printf(two\n ); fork BEFORE AFTER printf( One\n ); pid=fork(); printf( Two\n ); PC printf( One\n ); pid = fork(); printf( Two\n ); PC A B OS Homework 1.7
/*runls run ls in a subprocess */ main() int pid; pid = fork(); exec 와 fork 의공동이용 /*if parent, use wait to suspend _ execution until child finishes */ execv if(pid > 0) wait((int *)0); char *av[3]; printf( ls completed\n ); av[0]= ls ; exit(0); av[1]= -l ; av[2]=(char *)0; execv( /bin/ls, av); /*if child then exec ls*/ if(pid == 0) execl( /bin/ls, ls, -l,(char *)0); fatal( execl failed ); /*getting here means pid is negative, so error has occurred */ fatal( fork failed ); fatal(char *s) perror(s); exit(1); execlp, execvp 쉘환경변수 PATH 를따름 execlp( ls, ls, -l, (char *)0); execvp( ls, av); OS Homework 1.8
fork 와 exec호출의조합 pid = fork(); PC A BEFORE FORK AFTER FORK wait((int*)0); PC execl( /bin/ls ); PC A B /* first line of ls */ PC AFTER FORK AFTER EXEC wait((int*)0); PC A B (now runs ls) OS Homework 1.9
Fork 실습 telnet 211.119.245.68» id: 학번» passwd: 수업시간에알려줌 ftp 211.119.245.75» Id: anonymous id: ftp» passwd: 자기 loginid passwd: ftp 실습 1: ~mysung/osprog/fork.c 코드분석, 컴파일, 실행 실습 2: ~mysung/osprog/exec.c 코드분석, 컴파일, 실행 실습 3: ~mysung/osprog/background.c c 코드분석, 컴파일, 실행 실습 4: One, Two 출력하는 fork12.c 프로그램코딩, 컴파일, 실행 실습 5: 시스템호출 execl() 을이용하여 ls 프로그램을실행시키는 forkexecl.c 프로그램코딩, 컴파일, 실행 실습 6: 시스템호출 execv() 를이용하여 ls 프로그램을실행시키는 forkexecv.c 프로그램코딩, 컴파일, 실행 실습 5와실습 6은아래자기학번숙제디렉토리에제출하세요» csblade.incheon.ac.kr ac (211.119.245.68) 119 245 의지정디렉토리 (/export/home/homework/2007oshw.ab) 에자기학번의디렉토리만들고그곳에소스파일과실행파일복사» csmail.incheon.ac.kr (211.119.245.75) 지정디렉토리 (/home/homework/2007oshw.ab) 에자기학번의디렉토리만들고그곳에 소스파일과실행파일복사 OS Homework 1.10
Fork 문제 #include <stdio.h> int value = 5; main () int pid; pid = fork (); /* Duplicate. Child and parent continue from here */ if (pid!= 0) /* pid is non-zero, so I must be the parent */ wait(null); printf ("Parent: value = %d\n", value); else /* pid is zero, so I must be the child */ value += 15; printf ("Child: value = %d\n", value); printf ("PID %d terminates.\n",,getpid ());/ ); /* Both processes execute this */ OS Homework 1.11
Vi 를이용한기본텍스트편집 커서의이동» hjkl 이용 H J K L [Vi mode] 4j» G 명령으로원하는행으로이동 7G G : 마지막행으로» 화면이동 ^F ^B ^D ^U 텍스트추가, 삽입, 수정 a(append) i(insert) o(open) O(Open) R(Replace) 텍스트의삭제및취소 (undo) x(exclude?) d(delete) dw db d$ d^ r(replace) u(update) U(Update) 최근명령재실행. 파일관리» Vi를벗어나지않고저장하기 : :w» 저장않고끝내기 : :q!» 또다른파일편집 : :e xx 또는 :e! xx» 다른파일을읽어와덧붙이기 : :r xx http://marvel.inchon.ac.kr/ h / 의 Information 참조 OS Homework 1.12
Vi 편집모드 append insert open replace $Vi filename a esc i esc o esc R esc O ~ $ ~ Vi mode (Vi 명령모드 ) :q!( 기록않음 ) ~ ZZ( 기록 ) :wq x dd r 커서이동 OS Homework 1.13
Linux/Unix C 언어프로그래밍 cc compiler» man cc» $ cc o hello hello.c» $ hello gcc compiler» GNU project C and C++ Compiler GNU(GNU s Not Unix, Free Software Foundation의 Richard Stallman)» man gcc» info gcc» $ gcc hello.c» $ a.out» $ gcc o hello hello.c» $ hello OS Homework 1.14
유닉스디버거 : gdb 프로그램을기호적으로디버깅 : dbx, adb, sdb, gdb, ddd(motif) 등» 단일단계이동 (single stepping)» 정지점 (breakpoint)» 디버거내에서편집» 변수의접근및수정» 함수의탐색» 추적 (tracing) gdb» GNU debugger, 별도의프롬프트표시» 관련정보는, 프롬프트에서 help를입력» dbx executablefilename 디버그를위한프로그램준비» cc 의 -g 옵션으로프로그램을번역» 목적모듈내에디버깅정보포함 OS Homework 1.15
유닉스디버거 : gdb gdb 실행 gdb 실행파일이름 : 실행파일을디버그함 ( 실행파일은반드시 -g 옵션을사용하여컴파일되어야함 ) gdb 명령어» b (breakpoint) : 실행중디버그를위해멈추는위치지정» b 함수명 : 함수명에서멈춤» b 라인번호 : 라인번호에서멈춤» r (run) : 실행시작» n (next) : 현재라인실행 ( 함수의경우실행하고다음라인으로넘어감 )» s (step) : 현재라인실행 ( 함수의경우호출된함수내로들어가실행계속 )» c (continue) : 다음 breakpoint까지실행» l (list) : 현재수행되고있는라인부터 10개라인씩연속적으로소스코드를프린트» p (print) 변수명 : 변수명으로저장되어있는내용을프린트» h(h (help) : 도움말» q (quit) : gdb 종료 OS Homework 1.16