1991년 리누스 토발즈에 의해 최초로 개발되었으며 현재 세계에서 가장 많이 사용되는 운영체제이다.
라즈베리 파이 또한 리눅스 기반으로 동작한다.
Multi-user: 동시에 여러 사람이 사용
Multi-process: 동시에 여러 프로그램 실행
Multi-processor: 멀티 코어와 다중 CPU 지원
유닉스와 호환 가능하며, 공개 운영체제이기 때문에 무료이다.
실제 운영체제를 구성하는 핵심이며, 메모리, 프로세서, 저장장치, 네트워크 등 하드웨어를 관리한다.
시스템 호출과 같은 API가 제공되며, 하드웨어 제어를 위한 디바이스 드라이버가 있다.

쉘을 사용한 명령어 기반의 인터페이스(CLI)이며 X Window를 통해 GUI도 지원한다.
내장 명령어: 쉘에서 제공하는 명령어
유틸리티: 사용자 편의를 위해 시스템에서 제공하는 프로그램이며, 별도의 실행 파일로 제공한다.


리눅스의 주요 명령어를 정리해놓은 표이니 숙지하도록 하자. 이 외에도 수많은 명령어가 있으니 모르는 부분은 구글 검색을 통해 해결하자.
명령어 [옵션] [파일명]
* 대괄호[]는 생략 가능
명령어에 대한 도움말이 필요한 경우 ls --help와 같이 --help를 옵션으로 사용
자세한 도움말이 필요하다면 man ls와 같이 man page를 사용하도록 하자.
시스템 권한 명령어나 소유권, 디바이스 파일을 직접적으로 다루는 작업은 슈퍼 유저 권한이 필요하다.
최초 설치 후 root 권한을 얻기 위해 root 암호를 입력해서 계정을 활성화시켜야 한다.
~$ sudo passwd root
~$ su
~#
root 권한 획득 시 프롬프트 명령이 $ 기호에서 #기호로 바뀐다.
현재 디렉터리에 있는 파일 목록을 표시한다.
~$ ls (현재 디렉터리 파일 목록 표시)
~$ ls -a (숨김 파일 포함 모든 내용 표시)
~$ ls -a -l
~$ ls -al
(숨김 파일 포함 파일에 대한 권한,
생성 시간 등 자세한 내용 출력)
ls를 하게 되면 여러 파일의 종류를 확인할 수 있는데, 구분표는 아래와 같다.
※ 유닉스에서는 디렉터리, 디바이스 등이 모두 파일로 취급된다.


e.g. drwxr-xr-x
chmod를 통해 파일의 권한을 변경할 수 있다.
e.g. chmod 755 readme.txt
readme.txt의 권한을
cp [원본_파일] [복사될_위치나_파일]
-r 옵션 사용 시 서브 디렉터리까지 복사 가능
mv [원본_파일] [변경될_위치나_파일]
rm [삭제할_파일]
비어있는 디렉터리 삭제: rm -d, rmdir
서브 디렉터리까지 삭제: rm -r
강제 디렉터리 삭제: rm -rf
파일의 날짜와 시간을 수정하는 명령어
touch [파일명]
아무런 옵션이 없으면 최근 접근 시간과 최근 수정 시간을 변경하며, 파일이 없는 경우 크기가 0인 파일이 생성된다.
주요 옵션
-a: 파일의 접근시간/상태변경시간 변경
-c: 기존 파일이 없으면 파일 생성 X
-m: 파일의 수정시간만 변경
-r: 특정 파일의 타임스탬프로 접근시간/수정시간 변경
-d: 지정된 시간을 접근시간/수정시간 변경
-t: 특정 타임스탬프 접근시간/수정시간 변경
cd [디렉터리명]
아무런 인자가 없므녀 홈 디렉터리로 이동
cd . : 현재 디렉터리 표시
cd .. : 부모 디렉터리 표시
cd ~ : 홈 디렉터리 표시
mkdir [디렉터리명]
파일 내용 출력
cat [파일명]
2개 이상의 파일을 리디렉션 할 수 있음
~$ cat a.txt b.txt > c.txt
(a.txt b.txt를 합친 c.txt 생성)
파일 내용 확인
more [파일명]
파일 내용의 처음 몇 줄, 마지막 몇 줄 확인
head(or tail) [-n 숫지] [파일명]
여러 개의 파일을 하나로 묶을 때 사용하는 명령
tar [옵션] [압축된 파일명] [압축을 원하는 디렉터리명]
~$ tar zcvf abc.tar.gz ./doit
(해당 디렉터리를 abc.tar.gz로 묶고 gzip 압축 수행)
~$ tar zxvf abc.tar.gz
(gzip으로 압축된 tar 아카이브를 현재 디렉터리에 풀기)
find [옵션] [디렉터리명] [패턴]
~$ find / -name a.txt
(a.txt라는 파일 탐색)
다양한 패턴으로 파일을 탐색할 수 있는 명령
grep [옵션] [패턴] [디렉터리명]
~$ grep "aaa" *
(현재 경로의 모든 파일에서 해당 문자열 검색)
which: 프로그램 위치 반환
e.g. ~$ which bash
whereis: 프로그램과 설정파일, man page 등 관련 파일의 위치를 전부 보여줌
e.g. ~$ whereis bash
apropos: 인자로 사용한 프로그램과 비슷한 다른 프로그램들에 대한 정보 표시
e.g. ~$ apropos bash
초창기에는 C만 지원해서 이름이 GNU C Compiler 였으나, 이후 C, C++, Objective-C, Fortran, Java 등 다양한 언어를 지원하면서 GNU Compiler Collection으로 이름이 바뀌었다.

※ GCC? gcc?
GCC는 GNU 컴파일러 모음을 의미하며, gcc는 컴파일러 그 자체를 의미한다.
gcc는 리눅스의 기본 컴파일러이다. 리눅스 시스템이나 리눅스 커널 소스 코드 빌드용으로 주로 사용하며, 빌드할 경우 컴파일, 링킹 과정을 거쳐 실행파일이 만들어진다.
(컴파일할때 -c 옵션을 통해 목적 코드만 생성이 가능함)
gcc -o helloworld helloworld.c
* -o 옵션을 사용하지 않으면 기본으로 a.out이라는 이름으로 파일 생성
일반적으로 하나의 프로젝트에는 여러 개의 소스코드가 존재하므로, 이를 일일이 gcc를 이용해서 하나씩 컴파일 하는 것은 효율도 떨어지고 시간낭비이다.
따라서 makefile을 통해 복잡한 소스코드 빌드 작업을 자동화할 수 있도록 한다.
makefile의 생성 규칙
target1 : dependency1 dependency2 dependency3
command1
command2
command3
target2 : dependency3 dependency4 dependency5
command4
command5
target: 명령어를 수행한 후 결과물 (목적파일 or 실행파일)
dependency: 목표를 윟나 재료들 (소스코드 or 목적파일)
command: 실행되어야 할 명령어 (반드시 탭 문자로 시작할 것)
아래는 makefile 코드 예시이다. 일일이 컴파일 하는 것 보다 훨씬 편해진 것을 확인할 수 있다.
test : main.o print.o input.o
gcc -o test main.o print.o input.o
main.o : main.c common.h
gcc -c main.c
print.o : print.c common.h
gcc -c print.c
input.o : input.c common.h
gcc -c input.c
하지만 다른 프로젝트를 만들 때 마다 파일명도 바뀔 것 아닌가? 그럴때마다 저기 있는 main, print, input, common을 모두 바꿀 것인가?
이를 해결하기 위해 makefile 매크로 기능이 있으며, 더욱 간략하고 수정하기 용이하게 작성할 수 있다.
SRCS = main.c print.c input.c
OBJECTS = $(SRCS:.c=.o)
cc = gcc
CFLAGS = -g -Wall
TARGET = test
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS)
clean :
rm -f $(OBJECTS)
rm -f $(TARGET)
main.o: main.c common.h
print.o : print.c common.h
input.o : input.c common.h
SRCS: 소스코드 파일 목록
OBJECTS: 오브젝트 파일 목록
CC: 컴파일러
CFLAGS: 컴파일 옵션
TARGET: 빌드 결과물 이름
리눅스에서 프로그래밍 오류를 찾기 위한 디버깅 도구
gdb [프로그램명]
아래는 gdb 관련 기본 명령어이다.
quit: 종료 (Ctrl + D)
help: 도움말
break(b): 중단점 설정
clear: 중단점 해제
delete: 중단점 삭제
run: 프로그램 실행