chap1. introduction (unp library, shell, vi, server/client)

44
Chap1. Introduction (UNP Library, Shell, vi, Server/Client) 2005. 3. 11( 금 ) 금 금 금 [email protected]

Upload: yul

Post on 07-Jan-2016

38 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

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

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

2005. 3. 11( 금 )한 민 규

[email protected]

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

3

실습준비 실습 서버

amg.hufs.ac.kr, gaia.hufs.ac.kr 두 계정 배정 305 호 실험실에 개인 부여된 PC 에 리눅스 설치할 것

프로그램 구현 시 주의사항 port number : ‘5xxxx’ 부터 +10 까지

학번 뒤에 4 자리

ex) 학번이 200430128 일때 50128~50138 까지

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

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

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

5

실습준비 (Con’t)

Zombie Process 해결방법 ‘ps –a’ : 현재 프로세스 테이블을 보여준다 ‘kill -9 PID’ : PID 에 해당하는 Process 를 Process Table 에서

강제로 Process 의 resource 를 해제한다 .

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

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 계층 이하의 어떤 망 방식을 사용하든 관계없이 망 응용 프로그램을 작성할 수 있다 .

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

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

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

8

gcc –compiler(definition)

Compile 과정은 인간이 이해하는 언어를 CPU 가 이해하는 인스트럭션으로 변환하는 과정이다 .

#objdump –S 실행파일

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

9

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

*.c file(C 소스)

Cpp0전처리기

*.i(전처리기결과)

cc1C Complier

*.s(어셈블리파일)

AsComplier

*.o(오브젝트파일)

ld or collect2링크

실행파일

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

10

Compiler 작동과정 (Con’t) 실제 컴파일과정 Script

--save-temps option

전처리 과정

컴파일 과정

어셈블 과정

링크 과정

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

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( 사용자가 만든 라이브러리 )

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

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 이

다 .

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

13

gcc – unp library 설치 시 유의사항 ‘unpv13e/intro/daytimetcpcli.c’ 의 compile

compile 할 때 command 가 너무 복잡 Makefile 사용

compile 주의사항 Solaris 에서 socket library 를 사용하는 program 을 compile 할 때에는

‘– lnsl’ 과 ‘– lsocket’ library 를 link 해야함 .

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

14

Shell 의 정의 ‘ 셸’이란 유닉스 운영체제의 user interface 로서 사용자가

입력한 명령을 운영체제가 이해할 수 있는 명령으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램이다 .

OS

Shell

User Client

Output

Input

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

15

Shell 역할 입 / 출력 방향 결정 , foreground / background, pipe 처리 User 가 새로운 명령을 내릴 때마다 Shell 은 새로운

process 를 만들어 그 process 에 새로운 프로그램을 실행 모든 program 들은 서로 독립적인 process 에서

작동하도록 되어 있으며 , 이 program 들은 모두 Shell 의 child process

각 process 간의 통신은 Shell 환경을 통해 이루어지며 process 간의 우선순위 , 자원 배분 등을 Shell 에서 처리

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

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

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

17

Shell 의 특징 (Bourne Shell)

Bourne Shell (/bin/sh) Solaris 의 기본 Shell 대부분의 Shell 은 Bourne Shell 의 기능을 포함하여 확대 발전한

형태 강력하고 편리한 Shell 들의 등장으로 인해 특이한 상황을

제외하고는 거의 사용되지 않음 User prompt : $ Super-user prompt : #

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

18

Shell 의 특징 (C Shell)

C Shell (/bin/csh) FreeBSD 의 기본 Shell C 언어 기반의 Shell Bourne Shell 의 모든 기능과 명령어 history, alias, process

관리기능 확장을 추가로 가짐 User prompt : %

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

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

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

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

:

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

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 바로 이전 단어의 앞 빈칸으로 이동

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

22

Vi Command(Con’t) 문안편집

a (append) 현재 커서가 위치한 문자의 다음위치부터 입력함A 현재 커서가 있는 행의 마지막부터 입력함i (insert) 현재 커서가 있는 위치부터 입력함I 현재 커서가 있는 행의 처음부터 입력함o (open) 현재커서가 있는 행의 다음 행에 새로운 한 행을 삽입하면서 입력함O 현재커서가 있는 위치에 새로운 한 행을 삽입하면서 입력함

문안의 삭제x 커서위치의 한 문자 삭제dw 커서위치의 한 행을 삭제dd 커서위치의 한 행을 삭제:1,$ d 1 행부터 마지막 행까지 삭제D 커서위치의 오른쪽 모두 삭제

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

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 으로 보관한다 .

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

24

Wrapper Functions

Error Handling Error 에 의해서 Terminating 되는 일반적인 경우 Wrapper

Function 을 사용

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

25

Socket?

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

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

26

Socket?(Con’t)

unp.h

Definition socket function

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

27

Socket Address Structure

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

36

A Simple Daytime Server

Listen socket Creation

Combine Socket & Socket Address Structure

Wait for Request

Connect Socket Creation

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

37

gdb 디버거 gdb 는 명령어를 통해서 정보를 보이는데 메모리 정보를

보이는 명령어부터 , 스택 , signal, 레지스트관련 명령어 등이 있다 .

Gdb 를 사용하여 디버깅하기 위해서는 아래 명령어와 같이 옵션을 붙여 줘야 한다 . gcc –g –o test test.c

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

38

gdb 디버거 (Con’t)

gdb 실행파일 gdb 모드 r(run) : 실행파일 수행 (Error 를 체크할때 사용 ) bt(Back Trace) : Stack 을 Back Trace 한다 .

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

39

gdb 디버거 (Con’t)

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

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

40

gdb 디버거 (Con’t)

전체변수의 출력 (gdb) info locals : 로컬변수 리스트의 값 (gdb) info variables : 전역변수 리스트값 (gdb) p [ 변수명 ] : 해당 변수의 값

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

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 에 의해 생성된 자식 프로세스의 시스템 콜도 출력한다 .

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

42

strace – example

daytimetcpcli 의 프로세스가 call 하는 System call

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

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 : 시스템 콜 함수 호출을 같이 보임

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

44

ltrace – example

daytimetcpcli 의 프로세스가 call 하는 library

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

45

GUI 디버거 DDD 사용