chap1. introduction (unp library, shell, vi, server/client)
DESCRIPTION
Chap1. Introduction (UNP Library, Shell, vi, Server/Client). 2005. 3. 11( 금 ) 한 민 규 [email protected]. 실습준비. 실습 서버 amg.hufs.ac.kr, gaia.hufs.ac.kr 두 계정 배정 305 호 실험실에 개인 부여된 PC 에 리눅스 설치할 것 프로그램 구현 시 주의사항 port number : ‘ 5xxxx ’ 부터 +10 까지 학번 뒤에 4 자리 - PowerPoint PPT PresentationTRANSCRIPT
3
실습준비 실습 서버
amg.hufs.ac.kr, gaia.hufs.ac.kr 두 계정 배정 305 호 실험실에 개인 부여된 PC 에 리눅스 설치할 것
프로그램 구현 시 주의사항 port number : ‘5xxxx’ 부터 +10 까지
학번 뒤에 4 자리
ex) 학번이 200430128 일때 50128~50138 까지
4
실습준비 (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
5
실습준비 (Con’t)
Zombie Process 해결방법 ‘ps –a’ : 현재 프로세스 테이블을 보여준다 ‘kill -9 PID’ : PID 에 해당하는 Process 를 Process Table 에서
강제로 Process 의 resource 를 해제한다 .
6
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 계층 이하의 어떤 망 방식을 사용하든 관계없이 망 응용 프로그램을 작성할 수 있다 .
7
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 needmake # use "gmake" everywhere on BSD/OS systems
cd ../libfree # continue building the basic librarymake
cd ../libroute # only if your system supports 4.4BSD style routing socketsmake # only if your system supports 4.4BSD style routing sockets
cd ../libxti # only if your system supports XTImake # only if your system supports XTI
cd ../intro # build and test a basic client programmake daytimetcpclitest ./daytimetcpcli 127.0.0.1
8
gcc –compiler(definition)
Compile 과정은 인간이 이해하는 언어를 CPU 가 이해하는 인스트럭션으로 변환하는 과정이다 .
#objdump –S 실행파일
9
Compiler 작동과정 /usr/bin/gcc 의 내부에서 모든 과정이 일어난다 .
*.c file(C 소스)
Cpp0전처리기
*.i(전처리기결과)
cc1C Complier
*.s(어셈블리파일)
AsComplier
*.o(오브젝트파일)
ld or collect2링크
실행파일
10
Compiler 작동과정 (Con’t) 실제 컴파일과정 Script
--save-temps option
전처리 과정
컴파일 과정
어셈블 과정
링크 과정
11
gcc - 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( 사용자가 만든 라이브러리 )
12
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 이
다 .
13
gcc – unp library 설치 시 유의사항 ‘unpv13e/intro/daytimetcpcli.c’ 의 compile
compile 할 때 command 가 너무 복잡 Makefile 사용
compile 주의사항 Solaris 에서 socket library 를 사용하는 program 을 compile 할 때에는
‘– lnsl’ 과 ‘– lsocket’ library 를 link 해야함 .
14
Shell 의 정의 ‘ 셸’이란 유닉스 운영체제의 user interface 로서 사용자가
입력한 명령을 운영체제가 이해할 수 있는 명령으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램이다 .
OS
Shell
User Client
Output
Input
15
Shell 역할 입 / 출력 방향 결정 , foreground / background, pipe 처리 User 가 새로운 명령을 내릴 때마다 Shell 은 새로운
process 를 만들어 그 process 에 새로운 프로그램을 실행 모든 program 들은 서로 독립적인 process 에서
작동하도록 되어 있으며 , 이 program 들은 모두 Shell 의 child process
각 process 간의 통신은 Shell 환경을 통해 이루어지며 process 간의 우선순위 , 자원 배분 등을 Shell 에서 처리
16
Shell 종류 Bourne Shell (sh) C Shell (csh) Korn Shell (ksh) TENEX C Shell (tcsh) Bourne Again Shell(bash)
Bourne Shell
Korn Shell
Bash Shell
C Shell
17
Shell 의 특징 (Bourne Shell)
Bourne Shell (/bin/sh) Solaris 의 기본 Shell 대부분의 Shell 은 Bourne Shell 의 기능을 포함하여 확대 발전한
형태 강력하고 편리한 Shell 들의 등장으로 인해 특이한 상황을
제외하고는 거의 사용되지 않음 User prompt : $ Super-user prompt : #
18
Shell 의 특징 (C Shell)
C Shell (/bin/csh) FreeBSD 의 기본 Shell C 언어 기반의 Shell Bourne Shell 의 모든 기능과 명령어 history, alias, process
관리기능 확장을 추가로 가짐 User prompt : %
19
Shell 의 특징 (Bash Shell)
bash Shell (/bin/bash) Bourne Shell 의 확대발전형을 제작한다는 목표로 GNU 프로젝트
일환으로 개발 기본적으로 Bourne Shell 을 기반으로 하며 , C Shell 의 기능도
일부 포함 Linux 의 표준 Shell 로 채택 User prompt : $ Super-user prompt : # Test : finger ID
20
Introduction vi Editor
Modes of Operation
The Work Buffer During the editing session, vi make all changes in the buffer Advantage
오동작으로 원하지 않은 결과가 발생했을 때 , 파일에 저장되지 않도록 할 수 있다 .
Disadvantage 시스템이 다운될 경우 , 편집한 결과가 모두 소멸될 수 있다 .
Inputmode
Commandmode
Last Linemode
ESC
Insert, Append, Replace … Enter
:
21
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 바로 이전 단어의 앞 빈칸으로 이동
22
Vi Command(Con’t) 문안편집
a (append) 현재 커서가 위치한 문자의 다음위치부터 입력함A 현재 커서가 있는 행의 마지막부터 입력함i (insert) 현재 커서가 있는 위치부터 입력함I 현재 커서가 있는 행의 처음부터 입력함o (open) 현재커서가 있는 행의 다음 행에 새로운 한 행을 삽입하면서 입력함O 현재커서가 있는 위치에 새로운 한 행을 삽입하면서 입력함
문안의 삭제x 커서위치의 한 문자 삭제dw 커서위치의 한 행을 삭제dd 커서위치의 한 행을 삭제:1,$ d 1 행부터 마지막 행까지 삭제D 커서위치의 오른쪽 모두 삭제
23
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 으로 보관한다 .
24
Wrapper Functions
Error Handling Error 에 의해서 Terminating 되는 일반적인 경우 Wrapper
Function 을 사용
25
Socket?
Socket 을 이용하는 네트워크 응용 프로그램에서 상대방 세션과 IP 패킷을 주고 받기 위해서는 다음의 다섯 가지 정보가 정해져야 한다 . 통신에 사용할 프로토콜 (TCP 또는 UDP) 자신의 IP 주소 자신의 포트 번호 상대방의 IP 주소 상대방의 포트 번호
26
Socket?(Con’t)
unp.h
Definition socket function
27
Socket Address Structure
Socket 을 이용하는 통신 객체의 구체적인 주소를 표현하기 위해서는 주소 체계 (address family), IP 주소 , 포트번호 세 가지가 지정되어야 하며 이 세 가지 정보를 Socket address 라고 부른다 .
28
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
29
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
30
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
31
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
32
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
33
Socket Programming API close()
socket 과 TCP connection 의 종료
sockfd : 해당 socket descriptor
#include <unistd.h>int close(int sockfd);
Returns: 0 if OK, -1 on error
34
Socket Programming Flow
TCP Client
close()
socket()
send()read()
connect()
Sockaddr_in 구성
TCP Server
socket()
bind()
listen()
accept()
read()write()
Finished?
close()
read()
connect Request
Three-way handshaking
Block until connectio
n from client
EOF Notification
35
A Simple Daytime Client
Socket Address Structure : Address Family, port, IP Address
Socket Creation
Dotted decimal hexa decimalHost byteorder network byte order (short : 2byte)
Connect Request
Because Byte-Protocol
Standard Output
36
A Simple Daytime Server
Listen socket Creation
Combine Socket & Socket Address Structure
Wait for Request
Connect Socket Creation
37
gdb 디버거 gdb 는 명령어를 통해서 정보를 보이는데 메모리 정보를
보이는 명령어부터 , 스택 , signal, 레지스트관련 명령어 등이 있다 .
Gdb 를 사용하여 디버깅하기 위해서는 아래 명령어와 같이 옵션을 붙여 줘야 한다 . gcc –g –o test test.c
38
gdb 디버거 (Con’t)
gdb 실행파일 gdb 모드 r(run) : 실행파일 수행 (Error 를 체크할때 사용 ) bt(Back Trace) : Stack 을 Back Trace 한다 .
39
gdb 디버거 (Con’t)
Break Pointer Setting (gdb) b main : main() 의 시작부분에 브레이크 포인트가 걸린다 . (gdb) info b : 모든 브레이크 포인트가 걸린 곳을 보인다 . (gdb) cl main : main() 의 브레이크 포인트를 해제한다 . (gdb) d : 모든 브레이크 포인트를 지운다 .
40
gdb 디버거 (Con’t)
전체변수의 출력 (gdb) info locals : 로컬변수 리스트의 값 (gdb) info variables : 전역변수 리스트값 (gdb) p [ 변수명 ] : 해당 변수의 값
41
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 에 의해 생성된 자식 프로세스의 시스템 콜도 출력한다 .
42
strace – example
daytimetcpcli 의 프로세스가 call 하는 System call
43
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 : 시스템 콜 함수 호출을 같이 보임
44
ltrace – example
daytimetcpcli 의 프로세스가 call 하는 library
45
GUI 디버거 DDD 사용