Chalkboard PowerPoint Presentation

Similar documents
<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

PA for SWE2007

2009년 상반기 사업계획

11장 포인터

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PA0 for SSE2033

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PA for SWE2007

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료


Microsoft PowerPoint - 제9강 문자열

Computer Programming (2008 Fall)

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

PowerPoint 프레젠테이션

untitled

Microsoft PowerPoint - chap10-함수의활용.pptx

vi 사용법

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

OCW_C언어 기초

PowerPoint Presentation

Microsoft PowerPoint - chap06-2pointer.ppt

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

설계란 무엇인가?

PowerPoint 프레젠테이션

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - 06_(C_Programming)_(Korean)_Characters_Strings

강의10

금오공대 컴퓨터공학전공 강의자료

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap12-고급기능.pptx

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

untitled

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드]

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

11장 포인터

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - System Programming Lab Week1.ppt [호환 모드]

YRRZBRRLMCEQ.hwp

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

컴파일러

본 강의에 들어가기 전

02장.배열과 클래스

C 프로그램의 기본

13 주차문자열의표현과입출력

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

1장. 유닉스 시스템 프로그래밍 개요

Microsoft PowerPoint - chap-02.pptx

슬라이드 1

6주차.key

Microsoft PowerPoint - chap06-4 [호환 모드]

Chapter #01 Subject

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

기술문서 LD_PRELOAD 와공유라이브러리를사용한 libc 함수후킹 정지훈

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

K&R2 Reference Manual 번역본

KEY 디바이스 드라이버

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter_04.pptx

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - [2009] 02.pptx

C# Programming Guide - Types

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

Microsoft PowerPoint - chap11.ppt [호환 모드]

ABC 11장

chap7.key

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

개발도구

Data Structure

untitled

11장 포인터

Microsoft PowerPoint - Chapter 1-rev

歯9장.PDF

문서의 제목 나눔명조R, 40pt

Microsoft PowerPoint APUE(Intro).ppt

C 프로그래밊 개요

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

OCW_C언어 기초

Transcription:

시스템프로그래밍개요

유닉스 History

유닉스시스템표준 ANSI C 표준 미국표준협회 (ANSI) 에서표준화한 C 언어명세 : ANSX3.159-1989 ISO가이를받아들여 ISO/IEC 9899:1990으로발표함 (www.iso.org) C 언어의문법과라이브러리, 헤더파일을정의하고있다. POSIX 서로다른유닉스시스템사이에서상호이식이가능한응용프로그램을개발하기위한표준으로 IEEE 에서제정 POSIX.1(IEEE Std 1003.1) : C 언어응용프로그래밍인터페이스표준 POSIX.2(IEEE Std 1003.2) : 표준쉘과유틸리티프로그램인터페이스표준 시스템 V 인터페이스정의 SVID : 프로그램과장치에서이용할수있는시스템호출과 C라이브러리표준포함 POSIX 나 X/OPEN의작업은부분적으로 SVID에기반을두고있다. SVID 표준을준수하면하드웨어에독립적인프로그래밍을할수있다.

유닉스시스템표준 X/Open 가이드 X/Open 은유럽의유닉스제조업체를중심으로설립한단체로개방형시스템에대한표준을정의하고보급하고있음 X/Open 이식성가이드 : XPG3, XPG4 XPG 는운영체제의기본인터페이스, 국제화, 터미널인터페이스, 프로세스간통신, C 언어를포함한프로그래밍언어, 데이터관리 (ISAM,SQL) 등에관한지침이정의되어있음 XPG3 에서 POSIX 표준을통합 1996 년오픈소프트웨어재단과합병하여오픈그룹 (The Open Group) 으로새출발함. 오픈그룹이 UNIX 에대한상표권소유호출과 C 라이브러리표준포함 단일유닉스규격 (SUS) 컴퓨터운영체제가유닉스라는이름을사용하기위해지켜야하는표준의총칭이다. 오스틴그룹이관리, IEEE와오픈그룹의작업에기반하여 2002년에 SUSv3 발표 SUSv3에는 C언어의헤더파일규격, 쉘과명령어규격, 시스템호출규격등이포함.

유닉스벤더 유닉스벤더별특징및표준지원 특징및표준지원 IBM AIX SVR4 와 4.4BSD, OSF/1 을포함한다. AIX 5L 5.2 에서 SUSv2 를지원했으며, 5.3 부터는 SUSv3 을지원. SUN OS Solaris HP-UX Mac OS X Sco Linux BSD 계열 SVR4 계열 Solaris 8 부터 SUSv2 를지원했으며, Solaris10 부터 SUSv3 를지원. SVR4 + OSF/1 HP-UX 10.0 부터 SVR4 체계를지원했으며, 11.31 부터 SUSv3 를지원. BSD + SUSv3 공식적으로 10.5 부터 SUSv3 지원 SVR3 으로부터 SVR4 계승 OpenServer 5 는 POSIX.1-1988 과 POSIX.2 를지원, UnixWare 7.1.3 부터 SUSv1 을지원 SVID, SVR4, BSD 시스템고르게영향을받음표준체계인 SUS 를적극적으로도입하여최근커널은 SUSv4 까지지원

시스템프로그램이란? 리눅스시스템 ( 커널 ) 이제공하는시스템호출 (system call) 을사용해프로그램을작성하는것이다.. 운영체제란? 컴퓨터를작동시키고자원을관리하여사용자의응용프로그램이효율적으로실행될수있는환경을제공하는자원관리프로그램이다. 운영체제가관리해야하는자원은물리적자원과추상적인자원으로나누어진다

운영체제의구조

시스템콜과라이브러리함수 시스템콜이란? - 커널의자원을사용자가사용할수있도록만들어놓은함수들을말한다. - 시스템콜을호출하면커널모드로전환하여실행된다. 라이브러리함수란? - 사용자들이많이사용하는기능을미리함수로만들어서제공하는것이다. - ( 예 ) 문자열처리, 표준입출력, 수학관련공식 etc - 라이브러리함수는사용자모드에서실행된다.

시스템콜과라이브러리함수 응용프로그램 main() { 라이브러리함수 (); 시스템호출 (); } 라이브러리 라이브러리함수 { 시스템호출 (); } 시스템호출 시스템호출코드 사용자영역 커널영역 커널모듈 #n 커널모듈 #n 커널모듈 #n

시스템콜과라이브러리함수 (2)

시스템호출의오류처리방법 성공하면 0 을리턴, 실패하면 -1 을리턴 전역변수 errno 에오류코드저장 : man 페이지에서코드값확인가능 [ 예제 1-1] 시스템호출오류처리하기 ex1_1.c 01 #include <unistd.h> 02 #include <stdio.h> 03 04 extern int errno; 05 06 int main(void) { 07 if (access("unix.txt", F_OK) == -1) { 08 printf("errno=%d\n", errno); 09 } 10 11 return 0; 12 } # ex1_1.out errno=2 # vi /usr/include/sys/errno.h... /* * Error codes */ #define EPERM 1 /* Not super-user */ #define ENOENT 2 /* No such file or directory */...

라이브러리함수의오류처리방법 오류가발생하면 NULL 을리턴, 함수의리턴값이 int 형이면 -1 리턴 errno 변수에오류코드저장 [ 예제 1-2] 라이브러리함수오류처리하기 ex1_2.c 01 #include <stdlib.h> 02 #include <stdio.h> 03 04 extern int errno; 05 06 int main(void) { 07 FILE *fp; 08 09 if ((fp = fopen("unix.txt", "r")) == NULL) { 10 printf("errno=%d\n", errno); 11 exit(1); 12 } 13 fclose(fp); 14 15 return 0; 16 } # ex1_2.out errno=2 # ex1_2.out errno=2 man fopen에서확인 man fopen에서확인

man 페이지활용 man 명령을이용하여메뉴얼페이지를활용할수있다. # man s2 kill <manual section> 1. 일반명령어 2. 리눅스커널시스템호출 3. 표준 C 라이브러리함수 4. 특수파일 (/dev 아래의파일에대한설명 ) 5. 파일의형식이나구성파일 (ex. /etc/passwd) 6. 게임 7. 기타 ( 문자셋, SQL 문, ISO 표준, 정규표현식등등 ) 8. 시스템관리용명령어 9. 커널의여러부분의설명

헤더파일 C 는상수정의나시스템및라이브러리호출선언을담은헤더파일이필요하다. C 의경우 /usr/include 와그하위디렉토리에들어있다. 특정디렉토리에서헤더파일을찾아서사용해야한다면컴파일시 I 옵션으로헤더파일위치를지정할수있다. gcc I/usr/openwin/include fred.c 헤더파일을누락시킨채컴파일하는경우에는 Wall 옵션 ( 대부분의경고메시지출력 ) 을더하여 Warning 메시지를보고헤더파일을찾아서추가해준다.

gcc 컴파일과정이해

gcc 컴파일기본옵션 # gcc -W -Wall -O2 -o test test.c -Wall 모든모호한코딩에대해서경고를보내는옵션 -W 합법적이지만모호한코딩에대해서경고를보내는옵션 -W -Wall 아주사소한모호성에대해서도경고 -O2 최적화레벨을 2로설정 ( 거의대부분의최적화를시도 ) -o test 컴파일된파일명을 test로하라는의미

gcc 옵션 # gcc -E test.c 전처리과정의결과를화면에보이는옵션, 전처리과정중에발생한오류를검증할때사용하면좋다. # gcc -S test.c cc1 으로전처리된파일을어셈블리파일로컴파일까지만수행하고멈춘다. test.s 파일이만들어진다. # gcc -c test.c as 에의한어셈블까지만수행하고링크는하지않음. test.o 까지만만든다. # gcc -v test.c 컴파일과정을화면에출력한다. --save-temps 컴파일과정에서생성되는중간파일인전처리파일 (*.i) 과어셈블리파일 (*.s) 를지우지않고현재디렉토리에저장한다. 컴파일과정의에러를분석할때사용.

cpp0 옵션 (1) -I 전처리과정에서헤더파일을탐색하는기본디렉토리를추가한다. -include [ 헤더파일경로 ] 헤더파일을소스내에추가할때사용소스파일내에서 #include 하는것과동일 -D[ 매크로 ], -D[ 매크로 ]=[ 매크로값 ] 매크로를외부에서 define # gcc -DDEBUG -o test test.c -U [ 매크로 ] -D 와반대로소스파일내에 #undef 옵션을추가한것과동일 -M make 를위한소스파일의모든종속항목을출력 -MM make 를위한소스파일에서기본 include 디렉토리에있는헤더파일은빼고종속항목을출력전달됨.

cpp0( 전처리기 ) 옵션 (2) -nostdinc 디폴트 include 디렉토리 (/usr/include) 에서헤더파일을탐색하지않고 -I 옵션으로추가한디렉토리에서만헤더파일을찾는다. -C -E 옵션과함께사용하며전처리과정에서주석을제거하지않는다. ( 사용빈도낮음 ) -Wp,[ 옵션들 ] cpp0 와 gcc 옵션이같은것으로중복되면 gcc 옵션으로해석된다. gcc 가옵션을해석해서 cpp0, cc1, as, collect2 에게옵션을전달하기때문. gcc 의해석을거치지않고바로 cpp0 의옵션으로전달하고싶을때 -Wp 옵션을사용예 ) -Wp,-DDEBUG,-I/usr/include,-M => cpp0 로 -DDEBUG -I/usr/include -M 옵션이바로전달됨.

cc1 C 언어옵션 (1) -ansi ANSI C 표준에부합하는소스를작성하고자할때사용하는옵션 ANSI C 표준 (C89) 으로문법체크를하고 GNU C 의확장문법은사용불가능. 이식성높은코드를작성하고자한다면이옵션을사용. -std=[c 표준들 ] 기타다른표준들을지정하고자할때사용 (i) c89 또는 iso9899:1990 => -ansi 옵션과동일 (ii) c99 또는 iso9899:1999 => 1999년에새로제정된 ANSI C 표준, gcc 3.x 버전부터사용가능 (iii) gnu89 => GNU C89 표준으로문법체크, C99와유사하나완전동일하지는않다. (iv) gnu99 => GNU C99 표준으로문법체크 -traditional 오래된 Traditional C (K&R C) 문법으로체크, gcc 3.x 버전부터는지원하지않는다.

cc1 C 언어옵션 (2) - fno asm gnu89 문법에서지원하는 asm, inline, typeof 키워드를사용하지않는다. gcc 는기본적으로 gnu89 문법으로체크한다. < 참고 > asm 은 C 소스내에어셈블리코드를삽입할때, inline 은인라인함수지정할때, typeof 는변수타입을알아볼때사용. asm, inline, typeof 키워드는 ANSI C89 표준에서는지원하지않으므로 ANSI C89 에서지원하는 asm, inline, typeof 를사용해야한다.

cc1 경고옵션 -W -Wall 아주사소한경고까지표시 -Wno-[ 제거할경고 ] 경고메시지제거 ex: -Wunused, -Wunused-function, -Wunused-label, -Wunusedparameter, -Wunused-value, -Wunused-variable, -Wwrite-strings,... -w 모든경고메시지를제거 -Werror -pedantic 모든경고를컴파일을중단하는에러로취급해서경고하나만나와도컴파일중단. ANSI C89 표준에서요구하는모든경고메시지를표시 -pedantic-errors ANSI C89 표준에서요구하는모든에러메시지를표시 -Wtraditional 소스가 ANSI C 와 K&R C 간에서로다른결과를가져올수있는부분이있다면경고표시

cc1 최적화옵션 -O0 최적화를수행하지않음. -O1 -O2 가장많이사용하는옵션, 거의대부분의최적화를수행. -O3 가장높은레벨의최적화. 모든함수를인라인함수로취급해버림. 너무많은소스변경이생기므로왜곡발생. -Os 사이즈최적화를수행. 임베디드시스템에서자주사용.

cc1 디버깅옵션 -g gdb 에게제공하는정보를바이너리에삽입한다. 기본적으로 -g2 와동일. -g0 디버깅정보를삽입하지않음 -g3 디버깅정보를가장많이제공 -pg 프로파일을위한코드를삽입함. 프로그램이종료하면프로파일정보가 *.out 파일에저장됨. gprof 에의해 out 파일을분석

as 옵션 gcc 는 as 옵션을알지못한다. as 에게옵션을지정하기위해서는 - Wa,[as 옵션들 ] 형식으로 gcc 를거치지않고바로전달해야한다. -al 어셈블된인스트럭션을보인다. -as 정의된심볼을보인다. -l[ 패스 ] include 디렉토리를지정한다. 어셈블리소스내에서 사용된.include 지정자가지정하는헤더파일을찾을때사용. -W 또는 --no-warn 경고를출력하지않는다.

collect2 또는 ld 링크옵션 (1) -L[ 라이브러리디렉토리 ] 라이브러리를찾을디렉토리를지정. -l[ 라이브러리이름 ] 같이링크할라이브러리를지정라이브러리이름앞의 lib 을떼고확장자이전까지를라이브러리이름으로취급. (libtest.so => -ltest) 반드시컴파일명령에서소스파일의뒤에와야한다. 예 ) gcc -o test test.c -L/opt/lib -ltest < 참고 > main 보다앞에링크하면 undefined 참조오류발생. 그리고라이브러리내에 main 함수가있다면실행파일의 main 함수가실행되지않고라이브러리내의 main 이실행되버릴수있다. -shared -static 공유라이브러리와정적라이브러리가같이있을경우공유라이브러리를우선하여링크 ( 아무옵션을주지않아도공유라이브러리링크가우선함 ) 정적라이브러리를우선하여링크 -nostdlib 링크시에표준 C 라이브러리를사용하지않음.

collect2 또는 ld 링크옵션 (1) -nostartfiles crt1.o 등과같은 start up 파일을링크하지않는다. OS, 부트로더등을컴파일할때사용한다. -Wl,[ 링크옵션들 ] gcc 를거치지않고바로링크에게옵션을정해주고자할때사용한다. -s 실행파일에서심볼테이블제거 -x 출력파일에로컬심볼제거 -n 텍스트영역을읽기전용을만듦 -r 추후링크가가능하게오브젝트를만듦 -e [name] 시작심볼을 name 심볼로사용 ( 기본적으로 _start 심볼이시작심볼이다.) -M 심볼들의정보를자세히출력 -oformat [format] 주어진형식의오브젝트파일을생성

정적라이브러리와공유라이브러리 라이브러리개요. - 라이브러리는재사용을염두에두고작성한함수들을미리컴파일한결과를모아둔것이다. - 기본적으로제공되는표준라이브러리는 /usr/lib 에존재한다. -.a 와.so 확장자를가진다. - gcc 컴파일시에 -L 또는 l 옵션을사용하여다른디렉토리에있는라이브러리를이용할수있다. /usr/lib/libm.a 를표준 C 라이브러리와같이사용할수있도록컴파일. # gcc o fred fred.c lm # gcc o x11fred L/usr/openwin/lib x11fred.c lx11

정적라이브러리 (1) 정적라이브러리 (static library) - 미리만들어놓은오브젝트코드를 ar 도구를이용하여아카이브해놓은것이다. 정적라이브러리생성하기 $ mytest.c 를만든다. $ gcc c mystatic.c 로 mystatic.o 를생성한다. $ ar rv libmystatic.a mystatic.o

정적라이브러리 (2) 정적라이브러리호출하기 $ mymain.c 를만든다.

정적라이브러리 (3) 컴파일한다. $ gcc mymain.c o mymain lmystatic L -lmystatic 은 libmystatic.a -L libmystatic.a 가현재같은디렉토리에있음.

공유라이브러리 (1) 실행시사용가능한공유코드를참조하는방식으로링크된다. 공유라이브러리를로드하고참조함수를확인하는프로그램을동적로더 (ld.so) 라고한다. 이로더는 /etc/ld.so.cinf 에설정된경로를이용하여공유라이브러리를검색한다. 이구성파일에경로를추가한후 ldconfig 명령을실행하면캐쉬를업데이트한다.

공유라이브러리 (2) 공유라이브러리생성하기 myshared.c 를만든다. 컴파일한다. $ gcc c fpic myshared.c $ gcc shared o libmyshared.so myshred.o

공유라이브러리 (3) 공유라이브러리호출하기

공유라이브러리 (4) 해결방법 1 /etc/ld.so.conf 파일에경로를설정한후 ldconfig 로캐쉬를업데이트한다. 해결방법 2 LD_LIBRARY_PATH 환경변수에공유라이브러리가저장된경로를설정한다.

오류처리 일반적으로오류시반환값 - 시스템콜오류시 -1 반환, 전역변수 errno 에에러코드를설정한다. - 라이브러리함수오류시 NULL 반환 perror() 함수를이용한오류메시지출력 strerror() 함수를이용한오류메시지출력 errno 변수 - #include <errno.h> 를포함해야한다.

perror(3), strerror(3) #include <stdio.h> void perror(const char *s); perror( open ); 출력 : open: No such file or directory #include <string.h> char *strerror(int errnum); fprintf(stderr, %s,strerror(errno));

에러감지및종료 - exit 프로세스를종료하는가장일반적인방법은 exit() 함수를호출하는방식이다. #include <stdlib.h> void exit(int status); ANSI C 헤더에정의되어있는 status 상수 EXIT_SUCCESS 0 EXIT_FAILURE!= 0

동적인메모리할당 #include <stdlib.h> void *malloc(size_t size); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); void free(void *ptr); malloc 는지정된바이트수 size 만큼힙메모리에할당한다. calloc 는 nmemb 의 size 만큼배열을힙메모리에할당한다. realloc 는할당받은메모리크기를변경한다. - 새로지정한메모리양으로메모리를할당받고, 이전메모리의내용을복사한후, 이전할당받은메모리를반환한다. 그릭새로할당받은메모리를반환한다 free 는할당받은메모리를반환한다. 39

메모리할당예제 (1) #include <time.h> #include <sys/time.h> #include <string.h> #include <stdio.h> #include <stdlib.h> int main() { struct timeval *tvp; char *date; tvp = (struct timeval *)malloc(sizeof(struct timeval)); if (tvp == NULL) { fprintf(stderr, "Out of virtual memory.\n"); exit(1); } 40

메모리할당예제 (2) if (gettimeofday(tvp, NULL) == -1) { perror("gettimeofday failed"); exit(1); } date = strdup(ctime(&tvp->tv_sec)); if (date == NULL) { fprintf(stderr, "Out of virtual memory.\n"); exit(1); } printf("%s", date); free(tvp); free(date); return 0; } 41

메모리조작함수 #include <string.h> void *memcpy(void *dest, const void *src, size_t n); void *memmove(void *dest, const void *src, size_t n); void *memccpy(void *dest, const void *src, int c,size_t n); void *memchr(void *s, int c, size_t n); int memcmp(void *s1, const void *s2, size_t n); void *memset(void *s, int c, size_t n); memcpy는 src를 dest에 n바이트만큼복사. memcpy는 src를 dest에 n바이트만큼이동 memcpy는 src를 dest에 n바이트만큼복사하다 c가발견되면중지하고리턴 memchr는 s에서 n 바이트내에 c가있으면반환 memcmp s1과 s2를 n바이트만큼비교 memset는 s의 n바이트를 c로세팅 42

메모리조작함수예제 (1) #include <unistd.h> #include <string.h> struct mydata { int age; int weight; char name[16]; char juso[80]; }; int main() { struct mydata data; struct mydata *mdata; char f_data[120]; int my_weight; 43

메모리조작함수예제 (2) data.age = 29; data.weight = 64; strcpy(data.name, "yundream"); strcpy(data.juso, "seoul korea"); memset(f_data, 0x00, 120); } // data 구조체를 f_data 로메모리복사한다. memcpy(f_data, (void *)&data, sizeof(struct mydata)); mdata = (void *)&f_data; printf("pcopy %d\n", mdata->age); memcpy((void *)&my_weight, f_data+4, sizeof(int)); printf("%d\n", my_weight); 44

문자열복사함수 #include <string.h> char *strcpy(char *dest, const char *src); char *strncpy(char *dest, const char *src, size_t n); strcpy() 는 src 가가르키는문자열을 dest 가가르키는배열에복사한뒤 dest 의포인터를반환한다. src 에서복사될때 '\0' 까지복사됨으로문자열이겹쳐지지는않는다. 이때 dest 는 src 를모두복사받을수있을정도로충분히커야한다. strncpy() 는 n 을이용해서복사할문자열의크기를정할수있으므로버퍼오버플로우에좀더안전하다. 만약 src 의길이가 n 보다작다면 dest 의남는공간은 null 로채워진다. 45

문자열추가함수 #include <string.h> char *strcat(char *dest, const char *src); char *strncat(char *dest, const char *src,size_t n); strcat() 함수는 src 문자열을 dest 로 append 시킨다. 이때마지막에 '\0' 을추가시킨뒤 dest 에대한포인터를반환한다. 문자열을중첩되지않으며 dest 는문자열을저장하기위한충분한공간을가지고있어야한다. 이함수를이용할경우 dest 의공간을초과해서문자열이복사될수도있으며이는여러가지문제를발생시킨다. strncat 은 src 의 n 바이트만큼만 dest 에추가한뒤 dest 의포인터를반환한다. 46

문자열비교함수 #include <string.h> int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); 두문자열 s1 과 s2 를비교한다. 만약 s1 가 s2 보다작다면음수를같다면 0 을, 크다면양수를리턴한다. 두문자열 s1 과 s2 를비교한다. 이때처음 n 개만큼의문자만비교한다. strcmp(3) 와비슷한데, strcmp 는문자열전체를비교한다는점이 strncmp() 와다르다. 47

문자열추출함수 #include <string.h> char *strtok(char *s, const char *delim); char *strtok_r(char *s, const char *delim, char **ptrptr); token 은 delim 에있는문자를포함하지않은하나이상의문자로된문자열을의미한다. strtok() 함수는주어진문자열 s 를 delim 을기준으로토큰을뽑아낸다. strtok) 는다음토큰을가리키는포인터를리턴한다. 만약더이상가져올수있는토큰이없다면 NULL 을리턴하게된다. 토큰이구분자로끝나면, 이구분자가 \0 로겹쳐쓰여지고, 이에대한포인터가다음 strtok() 의호출을위해서저장된다. strtok_r() 함수는 strtok() 와동일하게작동한다. 그러나정적버퍼를사용하지않고 char * 포인터로할당된유저포인터를사용한다. 48

문자열조작함수 #include <string.h> char *strdup(const char *s); size_t strlen(const char *s); strdup() 함수는문자 s 를복사하고복사된문자열을가리키는포인터를반환한다. 문자를복사할공간을확보하기위해서내부적으로 malloc(3) 이호출된다. 그러므로 strdup() 함수를호출해서문자열복사를했다면 free(3) 등을통해서공간이필요없게되었을때커널에되돌려주어야한다. 에러발생시 NULL 을반환한다. strlen 은 '\0' 을만나기전까지의문자열 s 의길이를계산하여반환한다. 49

문자열검색함수 #include <string.h> char *strchr(const char *s, int c); char *strrchr(const char *s, int c); char *strstr(const char *haystack, const char *needle); strchr 은문자열 s 에서 c 를찾은위치포인터를반환한다. strrchr 은문자열 s 를뒤에서서부터앞쪽으로검색하여 c 를찾은위치포인터를반환한다. strstr 함수는문자열 haystack 에서 needle 이처음발견되는곳위치포인터를반환한다. 찾지못하면 NULL 을반환한다. 50

문자열변환함수 #include <stdlib.h> double strtod(const char *str, char **endptr); float strtof(const char *str, char **endptr); long double strtold(const char *str, char **endptr); long strtol(const char *str, char **endptr, int base); long long strtoll(const char *str, char **endptr, int base); long atol(const char *str); long long atoll(const char *str); int atoi(const char *str); strtod, strtof, strtold 함수는인자로받은문자열 nptr 을해석할수있는곳까지해석해서 double, float, long double 형으로표현한값을리턴한다. int i=atoi( 1234 ); 51

디버깅 문제점을수정하기위한디버깅과정이반드시필요하다. 사용가능한디버깅툴들

gdb(1) GNU 에서제공하는공개용디버거이다. 이도구를이용하려면컴파일시 g 옵션과함께컴파일되어야한다. 이용방법 $ gdb 실행파일명 or $ gdb P 실행중인 PID

gdb(2) - 명령어들

gdb(3) - 명령어들

gdb 사용법 (1) << 실행 >> GDB 를이용하기위해서는컴파일과정에서디버깅정보를삽입해야한다. 컴파일시옵션 'g' 이용 $ gcc -g -o main main.c 컴파일이정상종료되면 GDB 를실행한다. gdb [ 프로그램명 ] $ gdb main gdb [ 프로그램명 ] [ 프로세스 PID] $ gdb main 1928 GDB 가정상실행되면터미널의프롬프트가 (gdb) 로바뀌게된다. << 종료 >> 종료방법에는크게두가지가있다. ctrl + d (gdb) q (gdb) quit

gdb 사용법 (2) << 소스보기 >> 옵션에따라실행중인프로그램의소스를다양한방법으로볼수있다. l(list) list 10 list [ 함수명 ] list - // 이전 10 라인을출력한다. list [ 파일명 ]:[ 함수명 ] list [ 파일명 ]:10 list 명령어를사용하면소스코드가 10 줄단위로출력된다. 다음의명령을통해출력단위를변경할수있다. set listsize 20

gdb 사용법 (3) << 세그멘테이션폴트가발생했을대 >> 컴파일한프로그램을실행했을때 segmentation fault 가발생하여비정상종료되었다면다음의명령어를통해오류지점을확인할수있다. (gdb) r(run) run 명령어는 GDB 가프로그램을실행시켜이상이발생했을때의파일과지점을출력해준다. 또한관련함수또는변수에담긴값을출력하여오류수정에많은도움을준다. 오류지점에도달하기전과정을확인하기위해서는다음명령어를이용하면된다. (gdb) bt bt 명령어는백트레이스로프로그램스택을역으로탐색한다.

gdb 사용법 (4) << 브레이크포인트 >> 브레이크포인트는다음의방법들을통해설정가능하다. (GDB) b(break) [ 함수명 ] (GDB) break 10 (GDB) break [ 파일명 ]:[ 함수명 ] (GDB) break [ 파일명 ]:10 (GDB) break +2 // 현재행에서 2 개행이후브레이크포인트설정 (GDB) break -2 // 현재행에서 2 개행이전브레이크포인트설정 (GDB) break *0x8049000 // 메모리주소에설정 ( 어셈블리로디버깅시이용 ) (GDB) break 10 if var == 0 //var 변수의값이 0 일때 10 번행에설정 브레이크포인트의발동조건은다양하게변경가능하다. (GDB) condition [N] var == 0 //var 변수가 0 일때 N 번브레이크포인트동작 (GDB) condition [N] func(i) > 5 현재설정된브레이크포인트의목록은다음의명령으로확인가능하다. (GDB) info break

gdb 사용법 (5) 브레이크포인트는 GDB 가종료될때까지유효하다. 따라서필요없을때는다음의방법들을통해설정을지운다. (GDB) cl(clear) [ 함수명 ] (GDB) clear 10 (GDB) clear [ 파일명 ]:[ 함수명 ] (GDB) clear [ 파일명 ]:10 (GDB) d // 모든브레이크포인트지움 (GDB) disable br // 모든브레이크포인트비활성화 (GDB) disable br 1 3 //1 번, 3 번브레이크포인트비활성화 (GDB) ensable br // 모든브레이크포인트활성화 (GDB) ensable br 1 3 //1 번, 3 번브레이크포인트활성화

gdb 사용법 (6) << 프로그램실행 >> 프로그램의실행은 run 명령어를이용한다. 만일이미실행중일때는재실행한다. (gdb) r(run) 프로그램실행시인자를지정하기위해서는다음과같이이용한다. (gdb) run arg1 arg2 실행중인프로그램을종료할때는 kill 명령어를이용한다. (gdb) k(kill) 현재실행중인행의수행을멈추기위해서는 step 명령어를이용한다. step 명령어는한행씩동작하도록한다. next 명령어와는함수호출시다른결과를보인다. (gdb) s(step) (gdb) step 6 //step 을 6 번수행

gdb 사용법 (7) << 프로그램실행 >> 현재행의실행이멈춘상태에서다음행을실행하기위해서는 (gdb) n(next) (gdb) next 6 //next 를 6 번수행 만일 step 명령을이용중루프에빠져나오지못할경우에는 until 명령어를이용한다. (gdb) u(until) 한행씩이아닌다시연달아서실행하기위해서는 (gdb) c(continue) 함수가매우길어끝나는지점으로이동하기위해서는 finish 명령어를사용한다. (gdb) finish

gdb 사용법 (8) << 프로그램실행 >> 함수의남은부분을수행하지않고빠져나오기위해서는 return 명령어를사용한다. (gdb) return return 명령어를사용시 return 값을임의로지정하기위해서는다음과같이이용한다. (gdb) return 1234 << 와치포인트설정 >> 와치포인트는변수값의변화와코드의변화를확인할때편리하게이용가능하다. (gdb) watch [ 변수명 ] // 변수에값이써질때브레이크 (gdb) rwatch [ 변수명 ] // 변수의값이읽혀질때브레이크 (gdb) awatch [ 변수명 ] // 변수에읽기, 쓰기경우에브레이크

gdb 사용법 (9) << 변수와레지스터값검사 >> 현재위치한행에서접근가능한지역변수들목록확인 (gdb) info locals 현재위치한행에서접근가능한전역변수들목록확인 (gdb) info variables 확인하고싶은변수의값을출력하기위해서는 print 명령어를사용한다. (gdb) p(print) [ 변수명 ] // 변수의값 (gdb) print [ 함수명 ] // 함수의주소값 포인터변수의경우위의방법으로하면주소값만이출력된다. 포인터변수의값또는포인터구조체등의값을보기위해서는 * 를붙여준다. (gdb) print *[ 변수명 ] 이중포인터라면 ** 를붙여준다.

gdb 사용법 (10) << 변수와레지스터값검사 >> GDB 는변수뿐만아니라레지스터의값도확인할수있다. (gdb) print $[ 레지스터명 ] print 명령어는지역변수를우선하여보여주기때문에지역변수와전역변수에서동일한이름을사용할때전역변수를확인하기위해서는 :: 을이용한다. (gdb) print 'main.c'::[ 변수명 ] 파일명은 ' 따옴표 ' 으로감싸야한다. 특정함수에있는변수를확인하기위해서는 (gdb) print [ 함수명 ]::[ 변수명 ]

gdb 사용법 (11) << 변수와레지스터값검사 >> print 명령어로변수또는레지스터를확인할때는기본적으로 10 진수로출력한다. 이를다른형식으로보고싶을때는다음과같은방법을이용한다. (gdb) print/t [ 변수명 ] (gdb) print/o [ 변수명 ] (gdb) print/d [ 변수명 ] (gdb) print/u [ 변수명 ] (gdb) print/x [ 변수명 ] (gdb) print/c [ 변수명 ] (gdb) print/f [ 변수명 ] (gdb) print/a [ 변수명 ] //2진수로 //8진수로 //10진수로 (int) // 부호없는 10진수로 (unsigned int) //16진수로 // 최초 1바이트값을문자형으로 // 부동소수점값 // 가장가까운심볼의오프셋 print 명령어는값을보여줄뿐아니라값을설정하는것도가능하다. (gdb) print [ 변수명 ] = [ 값 ]

gdb 사용법 (12) << 화면에변수의값을자동으로디스플레이하기 >> display 명령어를이용하면매단계가진행될때마다자동으로변수의값을출력해준다. (gdb) display [ 변수명 ] display 변수를해제하기위해서는 undisplay 명령어를이용한다. (gdb) undisplay [N] display 역시 x,c,o 등등을이용해다양한형태로출력가능하다. GDB 사용법출처 : http://kwanseob.blogspot.kr/2012/03/gdb.html 참고도서 : 유닉스리눅스프로그래밍필수유틸리티

strace 시스템콜을추적할수있다. $ strace./test1 3>&1 more

ltrace 시스템콜을추적할수있다. $ ltrace./test1