• 컴파일러:
    • 자연어로 구성된 고급언어를 컴퓨터가 이해할 수 있도록 기계어로 번역해주는 소프트웨어
  • 디버깅:
    • 모든 소프트웨어에서 소스 코드의 오류를 찾아서 수정하는과정
  • :
    • 사용자-커널 사이 중계자 역할을 하는 프로그램 (본, C, 콘, 배시)
    • 명령어 해석기, 프로그래밍, 사용자 환경설정
  • 시스템 프로그래밍:
    • 컴퓨터 시스템의 운영 체제(OS)나 하드웨어와 밀접하게 연관된 저수준(low-level)의 프로그래밍
  • fork:
    • 부모 프로세스 에서 프로세스를 복제하여 자식 프로세스를 생성
  • 아카이브: 특정 시간에 함께 묶인 파일과 디랙토리 집합
  • 라이브러리: 유용한 기능을 가진 프로그램에 모듈을 모아놓은 파일
  • make: 모듈로 구성된 대규모 소스를 자동화하여 관리하도록 하는 도구

프로세스

  • 프로그램: 저장장치에 저장된 정적인 코드
  • 프로세스: 프로그램을 실행하여 메모리에 올라온 것
  • 부모 프로세스는 PPID, 자식 프로세스는 PID
  • 고아 프로세스:
    • 자식 프로세스가 종료되지 않은 상태에서 부모 프로세스가 죽어버린경우
  • 좀비 프로세스:
    • 부모 프로세스가 자식 프로세스의 종료를 기다린 뒤에 종료를 처리 해 주는 과정을 거치지 않고 부모 프로세스를 종료해 버린 경우
  • 백그라운드: 실행되었지만 눈으로 보이지 않는
  • 작업 제어: 포그라운드 > 백그라운드 전환하는 제어 (작업전환, 일시중지, 종료)
  • 작업 전환: 단순히 포그라운드 > 백그라운드 전환을 의미

링킹

  • 정적 링킹:
    • 최종 실행파일에 필요한 오브젝트 파일들을 미리 링크하여 실행 파일에 함께 포함
    • 실행파일만 있으면 별도 파일 없이 실행 가능
  • 동적 링킹:
    • 필요한 파일들을 미리 링크하지 않고, 실행하려고 할때 필요한 프로그램 모듈들을 결합하여 계속 사용
    • 실행파일 크기가 작어져 메모리를 조금 차지
    • 그러나 별도 필요 라이브러리가 제공되야함

라이브러리

유용한 기능을 가진 프로그램에 모듈을 모아놓은 파일

  • 정적 라이브러리 (.a):
    • 프로그램 빌드 시에 라이브러리가 제공하는 코드를 실행 파일에 넣어서 빌드하는 방식
  • 동적 라이브러리:
    • 실행도중에 동적으로 로딩
    • 필요한 라이브러리가 수시로 등록, 실행 제거가 가능
  • 공유 라이브러리 (.so):
    • 어떤 라이브러리가 제공하는 기능을 다른 애플리케이션에서 사용하고 싶을 때 라이브러리 코드를 메모리에 하나만 두고 각 애플리케이션에서 이를 공유하는 방식

GCC

  • gcc <옵션> <대상파일.c>
    • -o: 출력파일이름 지정
    • -g: gdb 디버깅 용으로 컴파일
    • -L<라이브러리>: 라이브러리가 있는 경로
    • -l<라이브러리>: 라이브러리 이름 (맨 뒤에 인자를 줘야)
      • 라이브러리 이름은 libm.a 또는 lib.so 파일에서 lib 접두사를 땐 m
    • -I<해더파일 경로>: 해더파일 탐색 경로
    • -rdynamic: 동적 라이브러리 경로 심볼정보 포함
  • ldd <실행파일>: 라이브러리 링크 보는법

단순 파일 연결

단순히 여러파일을 작성한경우

  • 이때는 무조건 출력파일을 지정해야 함
    • gcc -o <출력파일명> <대상파일.c | 대상파일.o...>

정적 라이브러리 (.a)

  • 생성:
    • gcc -c <대상파일.c> 오브젝트 파일 또는 목적파일(.o)
      • 링킹 과정이 되지않은 원시 기계어 코드
    • ar rcs <라이브러리파일.a> <.o파일> 정적 라이브러리 파일(.a)
  • 링킹:
    • gcc -L<라이브러리> <대상파일.c> -I<라이브러리 이름>

공유 라이브러리 (.so)

  • 생성:
    • gcc -shared -o <생성할 공유 라이브러리 파일.so> <대상파일.c> 공유 라이브러리 파일(.so)
  • 링킹:
    • gcc -L<라이브러리> <대상파일.c> -I<라이브러리 이름>

경로 문제

동적 라이브러리 는 시스템에 의해 로드되므로 시스템 경로에 없다면 오류가 발생함

  • 환경변수 지정

    export LD_LIBRARY_PATH=라이브러리 경로

동적 라이브러리

  • 생성:
    • dlfcn.h include
    • dlopen() 으로 라이브러리 로드
  • 링킹:
    • 링크시 libdl.so 와 링크
      • gcc -rdynamic <대상파일.c> -Idl

make

모듈로 구성된 대규모 소스를 자동화하여 관리하도록 하는 도구

Makefile 예제

# main.o -> search.o -> update.o 이 순으로 실행함
 
# 대상 : 의존 파일
	# 명령
sample : main.o search.o update.o
	# 실제 수행 작업 (커멘드)
	gcc -o sample main.o search.o update.o
 
main.o : main.c
	gcc -c main.c
 
search.o : search.c
	gcc -c search.c
 
update.o : update.c
	gcc -c update.c
 
# 해당 명령 접근은 make clean
clean :
	rm -rf sample main.o search.o update.o
  • 변수(메크로) 대상으로 task 자동 생성

    • $@: 있는 ${TARGET} 즉 대상
    • $^: ${OBJ} 즉 정의된 의존파일 전체를 나열함
    • $?: ${OBJ} 즉 정의된 의존파일중 변경된것들 다열함
    • $<: ${OBJ} 즉 정의된 의존파일중 가장 첫번째 꺼
    # 변수
    CC=gcc
    TARGET=sample
    OBJ=main.o search.o update.o 
     
    all : ${TARGET}
     
    ${TARGET} : ${OBJ}
    	# $@=위에 있는 ${TARGET} 즉 task 키 값을 의미
    	# $^=위에 있는 ${OBJ} 즉 정의된 필수 작업
    	${CC} -o $@ $^
     
    # 암시적으로 .c 파일을 .o 오브젝트 파일로 컴파일 하는거 정의
    .c.o:
    	# $@=여기서는 모든 .o 파일
    	# $<=현재 진행중인 target의 의존파일
    	$(CC) -c -o $@ $<
     
    clean :
    	rm -rf ${sample} ${OBJ}

아카이브

  • 아카이브: 특정 시간에 함께 묶인 파일과 디랙토리 집합
  • tar, cpio, ar 명령 등 이존재

tar

  • 폴더 tar로

    tar cvf <>.tar <묶을>
  • tar 파일 내용 출력

    tar tvf <대상>
  • tar 풀기

    tar xvf <대상>
  • tar에 파일 수정하여 추가
    즉 tar 파일 내부에 있는 파일을 업데이트 하는

    tar uvf <대상파>.tar <추가할>
  • tar에 파일 추가

    tar rvf <대상파>.tar <추가할>

압축

  • gzip <저장할 파일명.tar> <폴더 | 파일>
  • gunzip <압축된파일.gz> | gzip -d <압축된파일명.gz>
  • zip -r <압축파일명>.zip <폴더>
  • unzip <압축파일>.zip

셸 스크립트

  • 장점: 다른 프로그래밍 언어보다 훨씬 빠르게 처리
  • 단점: 복잡한 스크립트 들은 셸 스크립트 언어의 자체적인 제한 영역에서 실행 할 수 있다.

셸 변수 설정

띄어쓰기 허용안함

#!/bin/bash
=값

환경 변수 설정

  • 환경 전체에서 사용 가능한 변수
#!/bin/bash
export 키=값
 
# 다시 일반 쉘 변수로 바꾸기
export -n 키=값
 
# 환경변수, 쉘변수 모두 제거
unset

출력 형식을 지정하여 문자열 출력

#!/bin/bash
printf "%d+%d=%d" 10 20 30

연산 예제

echo ">> first: "
# 표준입력: 변수 a
read a
 
===연산은 무조건 expr 붙여야함===
add=`expr $a + $b`
===곱하기는 \n 무조건 필요함===
gob=`expr $a \* $b`

패키지 설치

(Advanced Package Tool)

  • apt-get:
    • remove <패키지 이름>: 패키지 삭제
    • purge <패키지 이름>: 설정 파일까지 모두삭제
    • source <패키지 이름>: 소스 코드 다운로드
  • apt-cache:
    • state: 시스템에 설치되어있는 전체 패키지 목록 보기
    • search <패키지 이름>: 패키지 검색
    • pkgname: 설치가능한 모든 패키지 검색
    • dump: 설치된 모든 패키지 업데이트 (사실은 로컬캐시 데이터 출력)
  • dpkg
    • -L <패키지 이름>: 패키지 종속성 확인
    • -i <.deb 파일>: deb 패키지 설치
    • -I <.deb 파일>: deb 파일 정보 확인
    • -l: 모든 패키지 확인
    • -r <패키지 이름>: 패키지 삭제
  • aptitude: 패키지 관리를 쉽게 할 수 있도록 자동화 기능 제공, sudo 필요
    • search <패키지 키워드>: 패키지 검색
    • update: 패키지 정보 업데이트
    • upgrade: 패키지 업데이트
    • install <패키지 이름>: 패키지 설치

파일 의미

  • /etc/passwd

    mm1:x:1000:1000:,,,:/home/mm1:/bin/bash
    • 이름:암호(x):UID:GID:,,,(GUD 폰번호등):홈 디렉토리:쉘
  • /etc/shadow (sudo 필요):

    • 실제 암호가 저장되는 곳
  • /etc/apt/sources.list (sudo 필요):

    • apt 저장소

명령어 정리

  • adduser:
    • :, 엔터 제외하고 다 됨
    • -u <UID>
    • -g <GID>
    • -d <디렉토리>: 디랙토리 지정
    • -p <패스워드>
  • usermod <옵션> <유저명>: 계정 정보 수정
    • -l <바꿀이름>: 계정 명 변경
    • -d <디렉토리>: 홈 디렉토리 이동
    • -g <그룹명>, -G <그룹명>: 메인그룹, 서브 그룹
  • find -user UID -exec rm -r {} ;: uid로 사용자 삭제
  • id: 사용자들 gid 확인
  • groupadd <그룹명>: 그룹 생성
  • groupdel <그룹명>: 그룹 삭제
  • ps:
    • -f: 상세 정보 출력
    • -e: 모든 프로세스 정보 출력
  • pgrep -l -n <프로그램>: 패턴으로 특정 프로세스 정보 출력
  • kill -9 <pid | %작업번호>
    • -CONT: 실행
    • -STOP: 정지
  • pkil -9 <프로세스 명령 이름>
  • stop <작업번호> 또는 (ctrl+z)
  • env: 환경변수 보기
  • sudo su - <사용자>
    • 계정 변경시 해당 사용자의 환경변수를 사용
    • - 안붙이면 기존 사용자의 환경변수 사용
  • man <숫자> <명령어>
    • 메뉴얼에 페이지 전환 (1=설명, 2=시스템 구조 (코드), 3=라이브러리)
  • tail -<숫자> <파일>