시스템 프로그래밍 개요와 Makefile
1강-1. 시스템 프로그래밍 개요
System Programming
- 시스템 소프트웨어를 만드는 프로그래밍 활동
- 다른 소프트웨어에게 서비스를 제공하는 소프트웨어를 만드는 프로그래밍 활동
- 유닉스 시스템 프로그래밍은 유닉스에서 제공하는 시스템 호출을 이용해서 프로그램을 작성하는 것
- 시스템 호출은 유닉스 시스템이 제공하는 서비스를 프로그램에서 이용할 수 있도록 지원하는 프로그래밍 인터페이스를 의미
What is system?
- 어떤 목적을 달성하기 위해서 필요한 것들을 모아둔 것
- A set of HW/SW resources combined for one purpose
System call & System SW
- 운영체제(Kernel / OS): 하드웨어를 효율적으로 관리해서 사용자가 원하는 서비스를 제공하는 소프트웨어
- Application -> System SW and Utilities -> System Call Interface -> Kernel(OS) -> Hardward
System Programming?
- System
- 하나의 목적을 위해 결합 된 자원(HW/SW)들의 집합
- System programming
- 시스템을 구성하는 자원을 다루는 프로그램
- 응용프로그램에 서비시를 제공하는 프로그램 (OS, firmware, compilers, I/O routines, scheduler, …)
- System call interface
- 시스템 프로그램이 제공하는 기능을 사용하기 위한 통로 (함수, …)
- 시스템에 대한 이해를 가지고 하는 프로그래밍
- 시스템을 구성하ㅏ는 자원 및 동작 방식에 대한 이해를 바탕으로 효율적인 프로그램 작성
- 시스템 자원의 기능을 활용하는 프로그래밍
- 시스템 자원을 직(간)접적으로 제어 (System call 활용)
System call vs Library function
- System call interface
- 시스템의 기능(서비스)을 이용/제어하는 통로
- Kernel 내 모듈을 직접 호출
- Library function
- 미리 컴파일 된 함수
- 자주 사용되는 기능을 독립적으로 구현
- 프로그램 개발을 빠르고 쉽게 하도록 도와 줌
- 내부적으로 System call을 활용
- 미리 컴파일 된 함수
Why system programming?
- Do more things
- Higher performance
1강-2. Unix/Linux 개요
Unix/Linux system
- 현재, 다양한 시스템에서 가장 널리 사용되는 OS
Unix/Linux architecture
- Kernel
- OS의 핵심 기능을 모아 놓은 것
- System call
- OS의 기능 중 응용프로그램이 사용하도록 허락된 기능들의 집합
- Shell
- 사용자와 OS 사이의 인터페이스
- 사용자의 입력을 해석하여 커넣의 함수 호출
- Utilities
Linux
- PC를 위한 효율적인 유닉스 시스템
- 오픈소스
- 다양한 플랫폼에 이식 가능
- 높은 안정성
- 강력한 네트워크 기능
- GNU 소프트웨어와 함께 배포
1강-3. Linux 기초 명령어
기초 명령어
Login/Logout
telnet | 유닉스시스템에 접속 | telnet 주소 | |
logout exit | 유닉스시스템에서 접속 해제 | logout exit |
Process management
ps | 현재 실행 중인 프로세스의 정보 출력 | -u : 특정 사용자의 Proc. -ef: 모든 Proc.의 상세 정보 | ps ps -u 사용자ID ps -ef |
kill | Process 강제 종료 | -9: 강제 종료 | kill 5000 kill -9 5001 |
File/Directory
pwd | 현재 디렉토리 경로 출력 | ||
ls | 디렉토리 내용 출력 | -a: 숨긴파일출력 -l: 파일 상세정보 출력 | |
cd | 현재 디렉토리 변경 | ||
cp | 파일/디렉토리 복사 | -r: 디렉토리 복사 | cp a.txt b.txt cp -r dir1 dir2 |
mv | 파일/디렉토리 이름변경과 이동 | mv a.txt b.txt mv a.txt dir1 | |
rm | 파일/디렉토리 삭제 | -r: 디렉토리 삭제 | |
mkdir | 디렉토리 생성 | ||
rmdir | 빈 디렉토리 삭제 | ||
cat | 파일 내용 출력 | ||
more | 파일 내용을 쪽단위로 출력 | ||
chmod | 파일 접근권한 변경 | chmod 755 a.exe chmod go+x a.exe | |
grep | 패턴 검색 | grep abcd a.txt |
Others
su | 사용자 계정 변경 | -: 변경할 사용자의 환경 초기화 파일 실행 | |
tar | 파일/디렉토리 묶기 | -cvf: tar파일 생성 -tvf: tar파일내용보기 -xvf: tar파일 풀기 | tar cvf a.tar * tar tvf a.tar tar xvf a.tar |
whereis which | 파일 위치 검색 | whereis ls which telnet |
Man page
- Unix/Linux 시스템 사용 설명서
man [options] [section] page
- page: 검색하려는 명령어/함수 이름
- section: page의 소속 구분
- 1: Shell cmd, 2: System call, 3: Std. library
Hello Linux
VI editor
입력모드전환 | i, a, o, O | 명령모드전환 | ESC |
커서이동 | j, k, h, l 또는 방향키 | 행이동 | #G (50G, 143G, …) :행번호 |
한글자수정 | r | 여러글자수정 | #s (5s, 7s, …) |
단어수정 | cw | 명령취소 | u, U |
검색하여수정 | :%s/aaa/bbb/g | 복사 | #yy (5yy, 10yy) |
붙이기 | p | 커서이후삭제 | D(shidt-d) |
잘라내기 | x, #x(3x, 5x, …) | 행삭제(잘라내기) | dd, #dd(3dd, 4dd, …) |
저장하고 종료 | :wq! ZZ | 저장하지 않고 종료 | :q! |
1강-4. Makefile & Make (Unix/Linux 컴파일 환경)
GNU C compiler
- Basic compiler for Unix/Linux
gcc [options] filename
- options
- -c: object file(.o)만 생성
- -o: execution file name 지정
- options
Makefile & Make
Makefile
- Compile 방법을 기술 하는 파일
- 관련 파일 정보, compile 명령, 실행 파일명 등
- 여러 파일로 구성된 프로젝트 설정과 비슷한 개념
Make
- 주어진 Makefile에 따라 compile을 수행하고, 실행파일을 생성
- 최초 컴파일 이후에는, 변경이 있는 파일만 컴파일 함
Without make file
1
2
3
4
5
$gcc -c -o main.o main.c
$gcc -c -o foo.o foo.c
$gcc -c -o bar.o bar.c
$gcc -o app.out main.o foo.o bar.o
Makefile -> 소스코드가 있는 폴더에 위치
1
2
3
4
5
6
7
8
9
10
11
app.out: main.o foo.o bar.o
gcc -o app.out main.o foo.o bar.o
main.o: foo.h bar.h main.c
gcc -c -o main.o main.c
foo.o: foo.h foo.c
gcc -c -o foo.o foo.c
bar.o: bar.h bar.c
gcc -c -o bar.o bar.c
- Rule block
1
2
3
4
5
6
7
8
9
10
<Target>:<Dependencies>
<Recipe>
# Target
- Bulid 대상 이름
- 일반적으로 최종 결과 파일명 사용
# Dependency
- Build 대상이 의존하는 Target이나 파일 목록
# Recipe
- Build 대상을 생성하는 명령어
- Implicit rules (Built-in rules)
- 자주 사용되는 규칙을 자동으로 처리
1
2
3
4
5
6
app.out: main.o foo.o bar.o
gcc -o app.out main.o foo.o bar.o
main.o: foo.h bar.h main.c
foo.o: foo.h foo.c
bar.o: bar.h bar.c
Variables (or Macro)
$(VarName)
1
2
3
4
5
6
7
8
9
10
11
CC = gcc
CFLAGS = -g -Wall
OBJS = main.o foo.o bar.o
TARGET = app.out
$(TARGET):$(OBJS)
$(CC) -o $@ $(OBJS)
main.o: foo.h bar.h main.c
foo.o: foo.h foo.c
bar.o: bar.h bar.c
Clean rule
- Build로 생성된 파일들을 삭제하느 규칙
- Clean build를 위해 사용 가능
1
2
3
4
5
clean:
rm -f *.o
rm -f $(TARGET)
$make clean
Makefile -basic pattern
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CC = gcc
CFLAGS = -g -Wall
OBJS = main.o foo.o bar.o
TARGET = app.out
all: $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $@ $(OBJS)
main.o: foo.h bar.h main.c
foo.o: foo.h foo.c
bar.o: bar.h bar.c
clean:
rm -f *.o
rm -f $(TARGET)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CC = <compiler>
CFLAGS = <options for compiler>
LDFLAGS = <options for linker>
LDLIBS = <a list of library to link>
OBJS = <a list of object file>
TARGET = <build target name>
all: $(TARGET)
clean:
rm -f *.o
rm -f $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $@ $(OBJS)
Comments powered by Disqus.