440 likes | 644 Views
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 자리
E N D
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자리 ex) 학번이 200430128 일때 50128~50138까지
실습준비(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
실습준비(Con’t) • Zombie Process 해결방법 • ‘ps –a’ : 현재 프로세스 테이블을 보여준다 • ‘kill -9 PID’ : PID에 해당하는 Process를 Process Table에서 강제로 Process의 resource를 해제한다.
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계층 이하의 어떤 망 방식을 사용하든 관계없이 망 응용 프로그램을 작성할 수 있다.
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
gcc –compiler(definition) • Compile과정은 인간이 이해하는 언어를 CPU가 이해하는 인스트럭션으로 변환하는 과정이다. • #objdump –S 실행파일
/usr/bin/gcc 의 내부에서 모든 과정이 일어난다. Compiler 작동과정
Compiler 작동과정(Con’t) • 실제 컴파일과정 Script --save-temps option 전처리 과정 컴파일 과정 어셈블 과정 링크 과정
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
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이다.
‘unpv13e/intro/daytimetcpcli.c’의 compile compile 할 때 command가 너무 복잡 Makefile 사용 compile 주의사항 Solaris에서 socket library를 사용하는 program을 compile 할 때에는 ‘–lnsl’과 ‘–lsocket’ library를 link 해야함. gcc – unp library 설치 시 유의사항
Shell의 정의 • ‘셸’이란 유닉스 운영체제의 user interface로서 사용자가 입력한 명령을 운영체제가 이해할 수 있는 명령으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램이다. Shell Output OS Input User Client
Shell 역할 • 입/출력 방향 결정, foreground / background, pipe 처리 • User가 새로운 명령을 내릴 때마다 Shell은 새로운 process를 만들어 그 process에 새로운 프로그램을 실행 • 모든 program들은 서로 독립적인 process에서 작동하도록 되어 있으며, 이 program들은 모두 Shell의 child process • 각 process간의 통신은 Shell 환경을 통해 이루어지며 process간의 우선순위, 자원 배분 등을 Shell에서 처리
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)
Shell의 특징(Bourne Shell) • Bourne Shell (/bin/sh) • Solaris의 기본 Shell • 대부분의 Shell은 Bourne Shell의 기능을 포함하여확대 발전한 형태 • 강력하고 편리한 Shell 들의 등장으로 인해 특이한 상황을 제외하고는 거의 사용되지 않음 • User prompt : $ • Super-user prompt : #
Shell의 특징(C Shell) • C Shell (/bin/csh) • FreeBSD의 기본 Shell • C언어 기반의 Shell • Bourne Shell의 모든 기능과명령어 history, alias, process 관리기능 확장을 추가로 가짐 • User prompt : %
Shell의 특징(Bash Shell) • bash Shell (/bin/bash) • Bourne Shell의 확대발전형을 제작한다는 목표로 GNU 프로젝트 일환으로 개발 • 기본적으로 Bourne Shell을 기반으로 하며, C Shell의 기능도 일부 포함 • Linux의 표준 Shell로 채택 • User prompt : $ • Super-user prompt : # • Test : finger ID
: 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 • 시스템이 다운될 경우, 편집한 결과가 모두 소멸될 수 있다.
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 바로 이전 단어의 앞 빈칸으로 이동
Vi Command(Con’t) • 문안편집 a (append) 현재 커서가 위치한 문자의 다음위치부터 입력함 A 현재 커서가 있는 행의 마지막부터 입력함 i (insert) 현재 커서가 있는 위치부터 입력함 I 현재 커서가 있는 행의 처음부터 입력함 o (open) 현재커서가 있는 행의 다음 행에 새로운 한 행을 삽입하면서 입력함 O 현재커서가 있는 위치에 새로운 한 행을 삽입하면서 입력함 • 문안의 삭제 x 커서위치의 한 문자 삭제 dw 커서위치의 한 행을 삭제 dd 커서위치의 한 행을 삭제 :1,$ d 1행부터 마지막 행까지 삭제 D 커서위치의 오른쪽 모두 삭제
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으로 보관한다.
Wrapper Functions • Error Handling • Error에 의해서 Terminating 되는 일반적인 경우 Wrapper Function을 사용
Socket? • Socket을 이용하는 네트워크 응용 프로그램에서 상대방 세션과 IP 패킷을 주고 받기 위해서는 다음의 다섯 가지 정보가 정해져야 한다. • 통신에 사용할 프로토콜(TCP 또는 UDP) • 자신의 IP 주소 • 자신의 포트 번호 • 상대방의 IP 주소 • 상대방의 포트 번호
Socket?(Con’t) • unp.h • Definition socket function
Socket Address Structure • Socket을 이용하는 통신 객체의 구체적인 주소를 표현하기 위해서는 주소 체계(address family), IP주소, 포트번호 세 가지가 지정되어야 하며 이 세 가지 정보를 Socket address라고 부른다.
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
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
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
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
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
Socket Programming API • close() • socket과 TCP connection의 종료 • sockfd : 해당 socket descriptor #include <unistd.h> int close(int sockfd); Returns: 0 if OK, -1 on error
Socket Programming Flow Block until connection from client connect Request Three-way handshaking EOF Notification
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
A Simple Daytime Server Listen socket Creation Combine Socket & Socket Address Structure Wait for Request Connect Socket Creation
gdb 디버거 • gdb는 명령어를 통해서 정보를 보이는데 메모리 정보를 보이는 명령어부터, 스택, signal, 레지스트관련 명령어 등이 있다. • Gdb를 사용하여 디버깅하기 위해서는 아래 명령어와 같이 옵션을 붙여 줘야 한다. • gcc –g –o test test.c
gdb 디버거(Con’t) • gdb 실행파일 gdb 모드 • r(run) : 실행파일 수행(Error를 체크할때 사용) • bt(Back Trace) : Stack을 Back Trace한다.
gdb 디버거(Con’t) • Break Pointer Setting • (gdb) b main : main()의 시작부분에 브레이크 포인트가 걸린다. • (gdb) info b : 모든 브레이크 포인트가 걸린 곳을 보인다. • (gdb) cl main : main()의 브레이크 포인트를 해제한다. • (gdb) d : 모든 브레이크 포인트를 지운다.
gdb 디버거(Con’t) • 전체변수의 출력 • (gdb) info locals : 로컬변수 리스트의 값 • (gdb) info variables : 전역변수 리스트값 • (gdb) p [변수명] : 해당 변수의 값
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에 의해 생성된 자식 프로세스의 시스템 콜도 출력한다.
strace – example daytimetcpcli 의 프로세스가 call 하는 System call
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 : 시스템 콜 함수 호출을 같이 보임
ltrace – example daytimetcpcli 의 프로세스가 call 하는 library