Beginning Linux Programming 한양대학교 전자전기컴퓨터공학부 3학년 실험 1주차
목 차(Context) 배경 소개 공지 사항 개발 환경 소개 UNIX LINUX GNU & FSF 시스템 관리팀 연락처 Workstation 실 사용 안내 계정 안내 개발 환경 소개 개발 환경 C 컴파일러 사용하기 헤더 파일 정적 라이브러리 동적 라이브러리
배경 소개 UNIX LINUX GNU & FSF
UNIX? AT&T의 부설 Bell 연구실에서 개발 1974년 C언어로 작성된 최초의 OS Solaris, FreeBSD, OpenBSD, System V ..
LINUX? Linux = Unix Clone Linus Torvalds(헬싱키 대학) 제안 + 전세계 유닉스 프로그래머 개발 Slackware, SuSE, Debian, Red Hat, ..
GNU & FSF GNU GNU Project FSF(Free Software Foundation) GNU is Not UNIX. GNU Project developing a complete UNIX style OS which is free software (LINUX) FSF(Free Software Foundation) Preserve, protect and promote the freedom to use, study, copy, modify, and redistribute computer software, and to defend the rights of Free Software users.
공지 사항 시스템 관리팀 연락처 Workstation 실 사용 안내 계정 안내
시스템 관리팀 연락처 Hompage : http://eece.hanyang.ac.kr E-mail :toggiya@ece.hanyang.ac.kr 02-2282-0579
Workstation 실 사용 안내 웍스테이션 실 사용 가능 시간 네트웍을 통한 원격 접속 방법 ssh를 사용하여 접속 평일 : 13시 ~ 21시 네트웍을 통한 원격 접속 방법 네트웍으로 접근 가능한 웍스테이션 apollo, baccus, quassar, diana, eros, kalypso, hercules, artemis, iccarus, muja, cupid, neptune, xanadu, rapier, pluto, titan ssh를 사용하여 접속 Putty 사용 추천(Google에 putty 검색해서 다운로드) xxx.hanyang.ac.kr 서버에 접속 [test@apollo guest]$ ssh artemis.hanyang.ac.kr 계정 입력 암호 입력
계정 안내 계정당 할당된 디스크 용량 150MB 사용자 홈디렉토리 /home/data1/계정이름 프린트시 lp 명령을사용 (개인당 100장씩 사용가능, 100이상 사용자는 관리자에게 연락할 것)
개발 환경 소개 개발 환경 C 컴파일러 사용하기 헤더 파일 정적 라이브러리 동적 라이브러리
개발 환경 VI Editor GCC C Compiler GDB Debugger
C 컴파일러(실습) C Program을 만들기 위해서 Editor로 vi를 사용한다. [test@apollo guest]$ vi ~ VIM - Vi IMproved ~ ~ version 6.1.320 ~ by Bram Moolenaar et al. ~ Vim is open source and freely distributable ~ Help poor children in Uganda! ~ type :help iccf<Enter> for information ~ type :q<Enter> to exit ~ type :help<Enter> or <F1> for on-line help ~ type :help version6<Enter> for version info 0,0-1 All
C 컴파일러(실습) 다음 명령을 실행한다. [test@apollo guest]$ vi filename.c ~ "filename.c" [New File] 0,0-1 All
C 컴파일러(실습) 위의 화면에서 “i“를 누르면 파일의 내용을 쓸 수 있게 된다. ~ -- INSERT -- 0,1 All
C 컴파일러(실습) File:filename.c 1 #include <stdio.h> 2 3 int main() 위와 같은 상태에서 다음과 같은 Code를 작성한다. File:filename.c 1 #include <stdio.h> 2 3 int main() 4 { 5 printf("Hello World\n"); 6 exit(0); 7 }
C 컴파일러(실습) int main() { printf("Hello World\n"); exit(0); } 위와 같은 작업을 수행한 후 작성한 내용을 저장하여야 하는데, shift + : 키를 누르면 화면 아래에 “ : “ 표시가 생긴다. 여기에 “wq” 명령을 수행하면 filename.c라는 파일이 만들어 진다. int main() { printf("Hello World\n"); exit(0); } ~ "filename.c" [New] 8L, 76C written [test@apollo guest]$
C 컴파일러(실습) [test@apollo guest]$ cc –o filename filename.c 수행 후 아무런 error 메시지가 나오지 않았다면 두개의 파일을 볼 수가 있다. [test@apollo guest]$ cc –o filename filename.c [test@apollo guest]$ ls -al total 40 drwxr-xr-x 4 test user 4096 Aug 27 02:11 . drwxr-xr-x 6 test user 4096 Aug 5 03:21 .. -rwxr--r-- 1 test user 11641 Aug 27 02:11 filename -rw-r--r-- 1 test user 76 Aug 27 02:11 filename.c [test@apollo guest]$
C 컴파일러(실습) [test@apollo guest]$ ./filename Hello World 화면의 두 파일 중 초록색의 파일이 실행 파일이다. ./filename 이라 명령을 입력한 후 실행 시켜본다. “ ./ “ 이 명령은 현재 디렉토리를 의미한다. 위의 명령의 수행 결과로 다음과 같은 화면이 나타난다. [test@apollo guest]$ ./filename Hello World [test@apollo guest]$
헤더파일 [test@apollo guest]$ cc –I/usr/openwin/include fred.c C언어 및 기타 프로그래밍 언어에서의 상수 또는 시스템 라이브러리를 호출하기 위한 함수들은 /usr/include 에 위치 cc –I/usr/openwin/include fred.c 어떤 함수에 대해 알고 싶을때 grep 명령을 사용할 수 있음 [test@apollo guest]$ cc –I/usr/openwin/include fred.c [test@apollo guest]$ cd /usr/include [test@apollo include]$ grep EXIT_ *.h ... stdlib.h:#define EXIT_FAILURE 1 stdlib.h:#define EXIT_FAILURE 0 [test@apollo include]$
라이브러리 파일 라이브러리(library) 라이브러리의 종류 재사용이 가능하도록 작성된 컴파일된 함수의 모음 표준 시스템 라이브러리는 /lib 와 /usr/lib에 위치 라이브러리의 이름은 lib로 시작 라이브러리의 종류 정적 라이브러리 (확장자 .a) 공유 라이브러리 (확장자 .so, .sa)
라이브러리 파일 [tes@apollo /guest]$ cc –o fred fred.c /usr/lib/libm.a fred.c 를 컴파일 하는데, 실행 파일의 이름은 fred를 사용하고 수치 연산 라이브러리를 사용 여기서 -lm 은 표준 라이브러리 디렉토리인 /usr/lib의 libm.a 를 의미 [tes@apollo /guest]$ cc –o fred fred.c /usr/lib/libm.a [tes@apollo /guest]$ cc –o fred fred.c –lm
정적 라이브러리 라이브러리 사용 확장자 .a ar(archieve) 프로그램 작성시 함수의 선언이 포함된 헤더 파일을 include 확장자 .a ar(archieve) 정적 라이브러리 생성, 관리 프로그램
실습하기 – 정적 라이브러리 #1 File:fred.c 1 #include <stdio.h> 2 3 void fred(int arg) 4 { 5 printf("fred: you passed %d\n", arg); 6 } File:bill.c 3 int bill(char* arg) 5 bill("bill:you passed %s\n", arg); 6 exit(0); 7 }
실습하기 – 정적 라이브러리 #2 [test@apollo guest]$ cc –c fred.c bill.c [test@apollo guest]$ ls *.o bill.o fred.o [test@apollo include]$ File:lib.h 1 /* 2 This is lib.h. It declares the functions 3 fred and bill for users 4 */ 5 6 void bill(char *); 7 void fred(int);
실습하기 – 정적 라이브러리 #3 File:program.c 1 #include "lib.h" 2 3 int main() bill() 과 fred() 를 시험하기 위해 program.c 파일을 작성 File:program.c 1 #include "lib.h" 2 3 int main() 4 { 5 bill("Hello World"); 6 exit(0); 7 } [test@apollo guest]$ cc –c program.c [test@apollo guest]$ cc –o program program.o bill.o [test@apollo guest]$ ./program bill: you passed Hello World [test@apollo guest]$
실습하기 – 정적 라이브러리 #4 [test@apollo guest]$ ar crv libfoo.a bill.o fred.o ar 을 사용하여 라이브러리가 생성한 뒤 라이브러리 목차를 정리하기 위해 ranlib를 사용한다. [test@apollo guest]$ ar crv libfoo.a bill.o fred.o a – bill.o a – fred.o [test@apollo guest]$ ranlib libfood.a [test@apollo guest]$ cc –o program program.o libfood.a bill: you passed Hello World [test@apollo guest]$
공유 라이브러리 정적 라이브러리의 단점 공유 라이브러리의 등장 Windows와 비교 많은 프로그램이 같은 라이브러리 함수를 사용할 때 메모리 낭비 공유 라이브러리의 등장 프로그램이 함수 코드 자체를 가지는 것이 아니라 실행시 유효한 공유 코드에 대한 참조를 가지도록 링크된다. Windows와 비교 .so : .DLL .sa : .LIB