1 / 44

Chap1. Introduction (UNP Library, Shell, vi, Server/Client)

Chap1. Introduction (UNP Library, Shell, vi, Server/Client). 2005. 3. 11( 금 ) 한 민 규 hufs96mk@hufs.ac.kr. 실습준비. 실습 서버 amg.hufs.ac.kr, gaia.hufs.ac.kr 두 계정 배정 305 호 실험실에 개인 부여된 PC 에 리눅스 설치할 것 프로그램 구현 시 주의사항 port number : ‘ 5xxxx ’ 부터 +10 까지 학번 뒤에 4 자리

yul
Télécharger la présentation

Chap1. Introduction (UNP Library, Shell, vi, Server/Client)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chap1. Introduction(UNP Library, Shell, vi, Server/Client) 2005. 3. 11(금) 한 민 규 hufs96mk@hufs.ac.kr

  2. 실습준비 • 실습 서버 • amg.hufs.ac.kr, gaia.hufs.ac.kr • 두 계정 배정 • 305호 실험실에 개인 부여된 PC에 리눅스 설치할 것 • 프로그램 구현 시 주의사항 • port number: ‘5xxxx’부터 +10까지 학번 뒤에 4자리 ex) 학번이 200430128 일때  50128~50138까지

  3. 실습준비(Con’t) • About Zombie Process • 불필요한 process가 있지 않도록 관리 • Zombie process • process가 종료할 때 parent process에 의해 지워지기 위해 대기중인 상태의 process • memory, disk, IO, CPU time 등의 자원은 사용하지 않고, process table의 용량을 차지함 [process transition diagram for Linux] • zombie process의 누적  한계치 수준의 process 생성  system crash

  4. 실습준비(Con’t) • Zombie Process 해결방법 • ‘ps –a’ : 현재 프로세스 테이블을 보여준다 • ‘kill -9 PID’ : PID에 해당하는 Process를 Process Table에서 강제로 Process의 resource를 해제한다.

  5. UNP Library • Wrapper function - W. Richard Stevens • Solaris, Linux, FreeBSD 등에 설치 가능 • Libunp.a,libfree.a, libroute.a, libxti.a로 구성 ※ XTI [ X/Open Transport Interface ] OSI 기본 참조 모델의 제4계층(transport layer)에서의 응용 프로그램 인터페이스(API)에 대한 X/Open의 규정. 이 API를 사용하면 제3계층 이하의 어떤 망 방식을 사용하든 관계없이 망 응용 프로그램을 작성할 수 있다.

  6. UNP Library Install • 압축해제 • tar xvfz unpv13e.tar.gz • Install 방법 ./configure # try to figure out all implementation differences cd lib # build the basic library that all programs need make # use "gmake" everywhere on BSD/OS systems cd ../libfree # continue building the basic library make cd ../libroute # only if your system supports 4.4BSD style routing sockets make # only if your system supports 4.4BSD style routing sockets cd ../libxti # only if your system supports XTI make # only if your system supports XTI cd ../intro # build and test a basic client program make daytimetcpcli test  ./daytimetcpcli 127.0.0.1

  7. gcc –compiler(definition) • Compile과정은 인간이 이해하는 언어를 CPU가 이해하는 인스트럭션으로 변환하는 과정이다. • #objdump –S 실행파일

  8. /usr/bin/gcc 의 내부에서 모든 과정이 일어난다. Compiler 작동과정

  9. Compiler 작동과정(Con’t) • 실제 컴파일과정 Script --save-temps option 전처리 과정 컴파일 과정 어셈블 과정 링크 과정

  10. version 확인 Compile option -c : object file 생성 ex) gcc –c hello.c -o : 실행코드의 output filename을 지정 ex) gcc –o test test.c (default : a.out) -O[level] : Object code를 최적화. level은 0부터 3(default : -O2) -g : 실행코드에 디버깅 코드 추가 ex) gdb 같은 디버거를 사용 -I : gcc가 헤더 파일을 찾는 헤더 경로 -l : 표준 라이브러리 이외의 라이브러리 링크시 사용 ex) –lm(수학 라이브러리), -lstuff(사용자가 만든 라이브러리) gcc - option

  11. gcc - library • library • Static library (*.a) : ar를 사용하여 만든 archive 파일 • static library는 compile 할 때 linker는 프로그램이 필요로 하는 부분을 library에서 찾아서 실행파일에 복사 • ar r libstuff.a factorial.o // ‘libstuff.a ‘ archive 생성 • ex) UNP library의 libunp.a • Shared library (*.so) • shared library(dynamic library)는 static library와 달리 실행파일에 단순히 "실행될 때 우선 이 라이브러리를 로딩시킬 것"이라는 메세지만을 남겨두게됨 • shared library를 사용하면 실행화일의 크기가 작아지고, 메모리와 하드 디스크의 용량도 적게 차지 • Linux의 기본 동작은 일단 shared library가 있으면 그것과 link를 시키고, 그렇지 않으면 static library를 가지고 link ※ archive : ‘members’ 라고 불리는 서브 파일들을 담고 있는 파일. ‘ar’에 의해서 관리되고, archive file의 목적은 link를 위한 sub-routine library이다.

  12. ‘unpv13e/intro/daytimetcpcli.c’의 compile compile 할 때 command가 너무 복잡  Makefile 사용 compile 주의사항 Solaris에서 socket library를 사용하는 program을 compile 할 때에는 ‘–lnsl’과 ‘–lsocket’ library를 link 해야함. gcc – unp library 설치 시 유의사항

  13. Shell의 정의 • ‘셸’이란 유닉스 운영체제의 user interface로서 사용자가 입력한 명령을 운영체제가 이해할 수 있는 명령으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램이다. Shell Output OS Input User Client

  14. Shell 역할 • 입/출력 방향 결정, foreground / background, pipe 처리 • User가 새로운 명령을 내릴 때마다 Shell은 새로운 process를 만들어 그 process에 새로운 프로그램을 실행 • 모든 program들은 서로 독립적인 process에서 작동하도록 되어 있으며, 이 program들은 모두 Shell의 child process • 각 process간의 통신은 Shell 환경을 통해 이루어지며 process간의 우선순위, 자원 배분 등을 Shell에서 처리

  15. Korn Shell Bourne Shell C Shell Bash Shell Shell 종류 • Bourne Shell (sh) • C Shell (csh) • Korn Shell (ksh) • TENEX C Shell (tcsh) • Bourne Again Shell(bash)

  16. Shell의 특징(Bourne Shell) • Bourne Shell (/bin/sh) • Solaris의 기본 Shell • 대부분의 Shell은 Bourne Shell의 기능을 포함하여확대 발전한 형태 • 강력하고 편리한 Shell 들의 등장으로 인해 특이한 상황을 제외하고는 거의 사용되지 않음 • User prompt : $ • Super-user prompt : #

  17. Shell의 특징(C Shell) • C Shell (/bin/csh) • FreeBSD의 기본 Shell • C언어 기반의 Shell • Bourne Shell의 모든 기능과명령어 history, alias, process 관리기능 확장을 추가로 가짐 • User prompt : %

  18. Shell의 특징(Bash Shell) • bash Shell (/bin/bash) • Bourne Shell의 확대발전형을 제작한다는 목표로 GNU 프로젝트 일환으로 개발 • 기본적으로 Bourne Shell을 기반으로 하며, C Shell의 기능도 일부 포함 • Linux의 표준 Shell로 채택 • User prompt : $ • Super-user prompt : # • Test : finger ID

  19. : ESC Command mode Last Line mode Input mode Enter Insert, Append, Replace … Introduction vi Editor • Modes of Operation • The Work Buffer • During the editing session, vi make all changes in the buffer • Advantage • 오동작으로 원하지 않은 결과가 발생했을 때, 파일에 저장되지 않도록 할 수 있다. • Disadvantage • 시스템이 다운될 경우, 편집한 결과가 모두 소멸될 수 있다.

  20. Vi Command • 화면제어 ctrl + f - 화면전체의 내용이 한 화면 위로 이동 ctrl + b - 화면전체의 내용이 한 화면 아래로 이동 ctrl + e - 화면전체의 내용이 한줄씩 위로 이동 ctrl + y - 화면전체의 내용이 한줄씩 아래로 이동 • 커서(Cursor)의 제어 ENTER Key 다음행의 처음으로 이동 j 한행 아래로 이동 k 한행 위로 이동 l 현재행의 오른쪽으로 이동 h 현재행의 왼쪽으로 이동 w 다음단어의 첫자로 이동 e 현재단어의 끝자로 이동 ^ 행의 제일왼쪽으로 이동 $ 행의 제일 오른쪽으로 이동 H 화면의 좌측상단으로 이동 M 화면의 좌측 중간으로 이동 L 화면의 좌측하단으로 이동 :숫자 지정한 숫자의 행으로 이동 :/문자열 오른쪽 하방향으로 문자열 검색 :?문자열 왼쪽 하방향으로 문자열 검색 n 아래로 검색을 계속함 N 위로 검색을 계속함 ctrl+g 현재의 화일이름과 행 수를 알려줌. b 바로 이전 단어의 앞 빈칸으로 이동

  21. Vi Command(Con’t) • 문안편집 a (append) 현재 커서가 위치한 문자의 다음위치부터 입력함 A 현재 커서가 있는 행의 마지막부터 입력함 i (insert) 현재 커서가 있는 위치부터 입력함 I 현재 커서가 있는 행의 처음부터 입력함 o (open) 현재커서가 있는 행의 다음 행에 새로운 한 행을 삽입하면서 입력함 O 현재커서가 있는 위치에 새로운 한 행을 삽입하면서 입력함 • 문안의 삭제 x 커서위치의 한 문자 삭제 dw 커서위치의 한 행을 삭제 dd 커서위치의 한 행을 삭제 :1,$ d 1행부터 마지막 행까지 삭제 D 커서위치의 오른쪽 모두 삭제

  22. Vi Command(Con’t) • 문안의 이동 및 복사 nyy n행을 버퍼에 복사 p 버퍼에 복사된 내용을 화면에 인쇄 3dd 현재커서가 위치한 행으로부터 3행을 삭제(이동원지정) 3p 지워진 3행이 커서가위치한 행 부터 지웠던 3행이 인쇄된다. Yy 현재커서가 위치한 한 행을 버퍼에 복사한다.( 3yy : 3행 복사) P 버퍼에 복사된 내용이 인쇄된다. • 기타명령어 U (Undo) 직전에 수행한 명령을 취소 또는 복구한다. r 한 문자 변경 cw 한단어 변경 J 행 결합 enter key 행 삽입 :sh shell을 수행한다. :!unix 명령어 unix 명령어를 수행하고 vi로 다시 돌아온다. :r filename 지정한 화일을 수행하고 vi로 다시 돌아온다. :w filename 현재내용을 지정한 filename으로 보관한다. :1, 10 w filename 1행부터 10행까지만 지정한 filename으로 보관한다.

  23. Wrapper Functions • Error Handling • Error에 의해서 Terminating 되는 일반적인 경우 Wrapper Function을 사용

  24. Socket? • Socket을 이용하는 네트워크 응용 프로그램에서 상대방 세션과 IP 패킷을 주고 받기 위해서는 다음의 다섯 가지 정보가 정해져야 한다. • 통신에 사용할 프로토콜(TCP 또는 UDP) • 자신의 IP 주소 • 자신의 포트 번호 • 상대방의 IP 주소 • 상대방의 포트 번호

  25. Socket?(Con’t) • unp.h • Definition socket function

  26. Socket Address Structure • Socket을 이용하는 통신 객체의 구체적인 주소를 표현하기 위해서는 주소 체계(address family), IP주소, 포트번호 세 가지가 지정되어야 하며 이 세 가지 정보를 Socket address라고 부른다.

  27. Socket Programming API • socket() • 네트워크 I/O를 하기 위해 먼저 원하는 protocol(TCP, UDP, 기타)을 지정하는 socket()을 호출 • family : address family를 지정 • AF_UNIX : UNIX internal protocol • AF_INET : Internet protocols • type : socket type • SOCK_STREAM : stream socket (TCP) • SOCK_DGRAM : datagram socket (UDP) • SOCK_RAW : raw socket(IP or ICMP) • protocol : type이 SOCK_RAW인 경우를 제외하고는 0 #include <sys/socket.h> int socket(int family, int type, int protocol); Returns: nonnegative descriptor if OK, -1 on error

  28. Socket Programming API • bind() • Socket에 IP address와 port number를 부여 • sockfd : socket descriptor • addr : server에서 사용할 IP address와 port number • addr_len : address 구조체의 크기(IPv4/IPv6) #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t addr_len); Returns: 0 if OK, -1 on error

  29. Socket Programming API • listen() • bind된 socket에서 외부로부터의 접속 요청을 기다림 • sockfd : socket descriptor • backlog : 연결 요청 대기 개수 (보통 5개 정도) #include <sys/socket.h> int listen(int sockfd, int backlog); Returns: 0 if OK, -1 on error

  30. Socket Programming API • connect() • bind된 socket을 통해 접속요청 • sockfd : socket descriptor • servaddr : 접속할 서버의 IP address와 port number • addr_len : servaddr 구조체의 크기 (IPv4/v6) #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addr_len); Returns: 0 if OK, -1 on error

  31. Socket Programming API • accept() • 연결요청이 왔을 때 연결을 수락 • sockfd : socket descriptorpeer • cliaddr : 연결 요청을 한 상대방의 IP address • addr_len : 상대방 IP addresss의 길이 #include <sys/socket.h> int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addr_len); Returns: nonnegative descriptor if OK, -1 on error

  32. Socket Programming API • close() • socket과 TCP connection의 종료 • sockfd : 해당 socket descriptor #include <unistd.h> int close(int sockfd); Returns: 0 if OK, -1 on error

  33. Socket Programming Flow Block until connection from client connect Request Three-way handshaking EOF Notification

  34. A Simple Daytime Client Socket Address Structure : Address Family, port, IP Address Socket Creation Host byteorder  network byte order (short : 2byte) Dotted decimal  hexa decimal Connect Request Because Byte-Protocol Standard Output

  35. A Simple Daytime Server Listen socket Creation Combine Socket & Socket Address Structure Wait for Request Connect Socket Creation

  36. gdb 디버거 • gdb는 명령어를 통해서 정보를 보이는데 메모리 정보를 보이는 명령어부터, 스택, signal, 레지스트관련 명령어 등이 있다. • Gdb를 사용하여 디버깅하기 위해서는 아래 명령어와 같이 옵션을 붙여 줘야 한다. • gcc –g –o test test.c

  37. gdb 디버거(Con’t) • gdb 실행파일  gdb 모드 • r(run) : 실행파일 수행(Error를 체크할때 사용) • bt(Back Trace) : Stack을 Back Trace한다.

  38. gdb 디버거(Con’t) • Break Pointer Setting • (gdb) b main : main()의 시작부분에 브레이크 포인트가 걸린다. • (gdb) info b : 모든 브레이크 포인트가 걸린 곳을 보인다. • (gdb) cl main : main()의 브레이크 포인트를 해제한다. • (gdb) d : 모든 브레이크 포인트를 지운다.

  39. gdb 디버거(Con’t) • 전체변수의 출력 • (gdb) info locals : 로컬변수 리스트의 값 • (gdb) info variables : 전역변수 리스트값 • (gdb) p [변수명] : 해당 변수의 값

  40. strace – dubugging • System-call tracer • 프로세스가 호출하는 시스템 콜을 화면에 출력한다. • Open, read, write 가 대표적 System call • 시스템 콜 – user mode의 Application이 Kernel Mode의 메모리 영역을 접근하기 위한 call • strace –fF ./daytimetcpcli 220.67.124.140 • amg.hufs.ac.kr IP Address : 220.67.124.140 • -f : fork되면 자식 프로세스의 시스템 콜까지 출력한다. • -F : vfork에 의해 생성된 자식 프로세스의 시스템 콜도 출력한다.

  41. strace – example daytimetcpcli 의 프로세스가 call 하는 System call

  42. ltrace - debugging • Library call tracer • 프로세스가 호출하는 공유 라이브러리 함수를 보여준다. • - static 옵션을 주어 정적 라이브러리와 링크하게 컴파일 한 실행 파일에 대해서는 아무런 정보도 제공하지 않는다. • ltrace –fS ./daytimetcpcli 220.67.124.132 • gaia.hufs.ac.kr IP Address : 220.67.124.132 • -f : fork된 자식 프로세스가 요청하는 공유 라이브러 함수까지 보임 • -S : 시스템 콜 함수 호출을 같이 보임

  43. ltrace – example daytimetcpcli 의 프로세스가 call 하는 library

  44. GUI 디버거 DDD 사용

More Related