고급시스템프로그래밍 제 1 장소개 창병모숙명여대컴퓨터과학과 1
강의목적 시스템프로그래밍 file, process, network programming Unix 시스템의체계적이해 고급시스템프로그래밍능력향상 2
동기 시스템프로그래밍 OS 지원을이용한프로그래밍 Unix 시스템호출사용 file, process, IPC, networking, 파일관리소프트웨어네트워크관련소프트웨어 DBMS, compiler, groupware, debugger, 3
Unix 운영체제 Unix 운영체제 1970 년대벨연구소의켄톰슨, 데니스리치등이개발 다양한버전 오늘날의유닉스시스템은 AT&T 를비롯한여러회사들과 버클리대학 (UCB) 등비영리단체들이개발한다양한버전 특징 다양한시스템사이에서서로이식할수있음 다중사용자및다중작업을지원 유닉스시스템의개념 일반텍스트파일 명령행인터프리터 계층적인파일시스템 장치및특정한형식의프로세스간통신을파일로취급등. 4
Unix 족보 5
유닉스종류와특성 Unix 1970년에 AT&T의벨연구소에서개발한운영체제로처음에는중형컴퓨터에사용하도록고안 여러가지유틸리티가공개되면서일반사용자들에확산 특징 다중사용자, 다중작업처리가능 프로그램개발이쉬운운영체제 대부분통신서비스프로그램은 Unix 를기반으로하고있음 6/20
유닉스종류와특성 Linux 1991년핀란드의대학생이었던리누스토발즈 (Linus Benedict Torvalds, 1969~ ) 에의해만들어진운영체제 개인컴퓨터용 UNIX 에해당 특징 종류 프로그램소스코드가공개돼있어프로그래머가원하는대로특정기능추가가능 어느플랫폼에도포팅 (porting) 이가능 무료 레드햇 (radhat), 데비안 (debian), 슬렉웨어 (slackware) 등 7
유닉스종류와특성 Mac OS Apple 컴퓨터의매킨토시계열개인용컴퓨터나워크스테이션용운영체제로개인용컴퓨터에 GUI를처음으로도입 1984년에처음으로세상에선을보인이후로거듭발전 현재 새로운 Mac OS X 특징 문서편집이나그래픽분야에서많은사랑을받고있음 Apple 의스마트폰인 iphon 과디지털미디어재생기인 ipod touch 에도내장되어사용 8
유닉스종류와특성 Solaris Unix 계열의운영체제중하나 Linux 보다훨씬먼저출시가된상용운영체제 특징 처음에는 SUN에서제작한스팍 (Sparc) CPU를사용한기종에서만사용되는전용운영체제로전문가들이주로사용 인텔아키텍처의대량보급으로인하여인텔용 Solaris 도출시됨 9
유닉스종류와특성 모바일운영체제 현재세계시장에공급되는범용으로사용되는모바일운영체제 Windows Mobile, Symbian, Falm, BlackBerry, Linux 등 모바일운영체제들의특징 MS 사의 Windows Mobile 과 Nokia 의 Symbian 등은사용하는데편리함 Apple, Microsoft, Palm 등은좀더많은개발자와사용자들에게 API를제공함 Linux는아예모든것을공개 Linux를기반으로모바일운영체제 리모 (LiMo) 안드로이드 (Android) 10
시스템프로그래밍소개 11
The System architecture of UNIX Hardware CPU, Memory, Disk, Peripherals Kernel Process management File management Hardware Memory management Device management System call UNIX Kernel System call Commands, Utilities, Applications the programmer's functional interface to the UNIX kernel Commands, Utilities, Application programs kernel services using library routines or system calls 12
시스템호출 Process Process Process System call interface File Management IPC Process Management 13
시스템호출 시스템인터페이스역할 Application programs talk to the operating system via system calls Programmer s functional interface to the UNIX kernel User Process fgetc(), fscanf() User space Kernel space System call Library trap routine Kernel call dispatch read() rdwr() readi(), writei() 14
사용자모드 / 커널 User process result=open( file.txt, O_RDONLY); User code Kernel Address of kernel close() Address of kernel open() Address of kernel write() open(char *name, int mode) { <Place parameters in registers> <Execute trap instruction, kernel code for open() switching to kernel code > { <Manipulate kernel data> <Return result of system call> } C runtime library... <Return to user code> } Kernel system call code 15
시스템호출요약 파일관련시스템호출 open(), close(), read(), write(), dup(), seek(), 프로세스관련시스템호출 fork(), exec(), ec(), exit(), wait(), getpid(), getppid(), 시그널관련시스템호출 signal(), alarm(), kill(), sleep(), IPC 관련시스템호출 pipe(), socket(), 16
시스템호출과 C 라이브러리함수 17
시스템호출과라이브러리함수 시스템호출 (System Calls) Unix 커널에서비스요청하는호출 UNIX man 의 Section 2 에설명되어있음 C 함수처럼호출될수있음. C 라이브러리함수 (Library Functions) C 라이브러리함수는보통시스템호출을포장해놓은함수 보통내부에서시스템호출을함 18
시스템호출과라이브러리함수 C library functions application code user process system calls kernel kernel hardware (harddisk ) 19
C Standard I/O Library 1975 년에 Dennis Ritchie 에의해작성 많은 OS 상에구현됨 ANSI C Standard Library 버퍼할당 (Buffer allocation) 최적크기단위로 I/O 를수행 디스크 I/O 횟수최소화 스트림 (Stream) 열린파일을스트림이라고한다. 문자의흐름으로파일입출력을다룬다 20
파일 C 의파일은모든데이터를연속된바이트형태로저장한다. 21
C 언어의파일종류 텍스트파일 (text file) 사람들이읽을수있는문자들을저장하고있는파일 텍스트파일에서 한줄의끝 을나타내는표현은파일이읽어들여질때, C 내부의방식으로변환된다. 이진파일 (binary file) 모든데이터는있는그대로바이트의연속으로저장 이진파일을이용하여메모리에저장된변수값형태그대로파일에저장할수있다. 22
파일열기 파일을사용하기위해서는 반드시먼저파일열기 (fopen) 를해야한다. 파일열기 (fopen) 를하면 FILE 구조체에대한포인터가리턴된다. FILE 포인터는열린파일을지정한다. 23
파일열기 파일입출력과정 파일열기, 읽기 / 쓰기, 파일닫기 파일열기 fopen() #include <stdio.h> FILE *fp; fp=fopen(" 파일이름 ", " 입출력방식 "); 24
fopen 모드 모드 "r" "w"" 내용 읽기전용으로연다쓰기전용으로연다. 파일이없으면새로생성하고이미존재하면그파일내용을삭제 "a" 추가용으로연다. 파일이없으면새로생성한다. "r+" r+ 이미존재하는파일을읽기쓰기 ( 갱신 ) 용으로연다. "w+" 파일을생성하고갱신용으로연다. "a+" 파일을추가용, 갱신용으로연다. 파일이없으면새로생성한다. "rb" 이진파일을읽기용으로연다. "wb" 이진파일을쓰기용으로연다. "ab" 이진파일을추가용으로연다. 파일이없으면새로생성한다. "rb+" 이미존재하는이진파일을갱신용으로연다. "wb+" 이진파일을생성하고갱신용으로연다. "ab+" 이진파일을추가용, 갱신용으로연다. 파일이없으면새로생성한다. 25
FILE 구조체 파일관련시스템호출함수 파일디스크립터 (file descriptor) 열린파일을나타낸다. 표준입출력함수 FILE 구조체에대한포인터 열린파일을나타낸다. FILE 구조체 열린파일에대한정보를포함하는구조체 파일디스크립터 (file descriptor) 버퍼에대한포인터, 버퍼크기 에러플래그등 #include <stdio.h> 26
FILE 구조체 열린파일의상태를저장하기위한구조체 <stdio.h> 에정의되어있음 typedef struct { int _cnt; // 버퍼에남아있는문자의수 unsigned char *_ptr; // 버퍼내에다음쓸 ( 읽을 ) 위치포인터 unsigned char *_base; unsigned char _flag; unsigned char _file; // 파일디스크립터 } FILE ; // 버퍼시작주소 // 스트림의현재상태 _IOFBF, _IOLBF, _IONBUF _IOEOF, _IOERR _IOREAD, _IOWRT 27
FILE 구조체 FILE * (FILE 구조체에대한포인터 ) 파일을열면 (fopen 함수 ) 리턴된다. 열린파일에대한정보를가리키는포인터 표준 I/O 함수들의매개변수로전달된다. 프로그래머는 FILE 구조체의내부는몰라도프로그램작성가능 28
표준입력 / 출력 / 에러 표준 I/O 스트림 (stream) 프로그램이시작되면자동으로 open 되는스트림 stdin, stdout, stderr FILE* #include <stdio.h> 표준입출력포인터 설명 가리키는장치 stdin 표준입력에대한 FILE 포인터키보드 stdout t 표준출력에대한 FILE 포인터모니터 stderr 표준오류에대한 FILE 포인터모니터 29
표준입출력 : 예 30
fclose() #include <stdio.h> int fclose ( FILE *fp ); 스트림을닫는다 리턴값 : 성공하면 0, 실패하면 EOF (-1) 출력버퍼에있는모든자료는파일에저장되고, 입력버퍼에있는모든자료는버려진다. 프로세스가정상적으로종료한경우에는모든열려진스트림이저절로닫힌다 31
표준 / 파일입출력함수 표준입출력함수 표준파일입출력함수 기능 getchar() fgetc(), getc() 문자단위로입력하는함수 putchar() fputc(), putc() 문자단위로출력하는함수 gets() fgets() 문자열을입력하는함수 puts() fputs() 문자열을출력하는함수 scanf() fscanf() f() 자료형에따라자료를입력하는함수 printf() fprintf() 자료형에따라자료를출력하는함수 32
파일입출력 : 예 33
파일복사 : 예 34
C 프로그래밍개발도구 35
컴파일러 gnu c compiler 컴파일 gcc sample.c 실행 a.out 실행파일지정 컴파일 실행 gcc o sample sample.c sample 36
다중모듈프로그램 여러개의파일로구성된프로그램 reverse.h void reverse(); /* 선언 */ reverse.c #include <stdio.h> #include reverse.h void reverse(char *before, char *after) { int i, j, len; len = strlen(before); for (j = len-1, i=0; j>=0; j--, i++) after[i] = before[j]; after[len] = NULL; } 37
다중모듈프로그램 main1.c #include <stdio.h> #include reverse.h main() { } char str[100]; reverse( cat, str); printf( reverse (\ cat\ ) = %s\n, str); reverse( noon, str); printf( reverse (\ noon\ ) = %s\n, str); gcc c reverse.c main1.c gcc o main1 reverse.o main1.o main1 38
디버거 gdb gdb 기능 단일단계이동 (single stepping) 정지점 (breakpoint) 변수접근및수정 함수탐색 추적 (tracing) 컴파일 gcc g 옵션을이용하여컴파일 gdb 실행파일 help 39
gdb 명령어 break [file:]function Set a breakpoint at [file:]function run [arglist] Start t program bt Backtrace: display the program stack. print expr c Continue running program next Execute next line (after stopping); step over any function calls in the line. step Execute next line; step into any function calls in the line. quit 40
DDD on Linux Data Display Debugger (DDD) Graphical gdb on Linux 41
The File Dependency System Make Why do we use make? gcc "reverse.c" gcc -o main1 reverse.o, main1.o to produce a new version gcc -o main2 reverse.o, main2.o to produce a new version We want to update files automatically based on dependency rules make [ -f makefile] - updates files based on a series of dependency rules in "make file". - If no option is specified, the name "makefile" is assumed. 42
The File Dependency System Make make files consist of make rules targetlist: dependencylist commandlist targetlist a list of target files dependencylist a list of files that the files in targetlist depend on commandlist a list of commands that reconstructs the target files from the dependency files. 43
The File Dependency System Make main1: main1.o reverse.o gcc main1.o reverse.o -o main1 main1.o : main1.c reverse.h gcc -c main1.c reverse.o : reverse.c reverse.h gcc -c reverse.c main1 main1.o reverse.o main1.c reverse.h reverse.c reverse.h Figure : make dependency tree 44