본문 바로가기

강의 정리/시스템 프로그래밍

시스템 프로그래밍 (2) 리눅스 소개

- 유닉스의 역사

1970년대 초 AT&A 벨 연구소에서 개발.

어셈블리어로 개발됐으나 C언어로 재작성.

 

-유닉스 기반 운영체제

System V, BSD 유닉스 등이 있으나

-> Liux.

PC를 위한 효율적인 유닉스 시스템.

소스코드 공개, 인터넷 통해 확장. 다양한 플랫폼에 포팅 가능, 무료 배포판 - RedHat, Fefora, Ubuntu, CentOS 등 존재.

 

 

- 유닉스의 특성

1) 다중 프로세스.

프로세스는 실행 중인 프로그램을 의미.

선점 가능한 프로세스: 여러개를 돌리지만 그 여러개를 동시에 돌리는 것X, 하나씩 여러개를 번갈아 돌림.

 

2) 다중 프로세스.

두 개 이상의 CPU를 가진 시스템도 지원.

 

3) 높은 이식성, 확장성.

다양한 언어로 작성된 프로그램 실행 가능. 

 

4) 다중 사용자 환경.

여러 사용자가 동시에 작업하는 것 허용. 터미널, 네트워크 연결을 통해서 하나의 시스템에 접속 가능.

이때 파일 및 디렉토리에 대한 소유권/접근 권한 설정 중요.

 

5) 소유권.

파일 및 디렉토리가 어느 사용자의 것인지 알림. 모든 파일과 디렉토리는 시스템 등록 사용자 중 한 사용자의 소유가 됨.

 

6) 접근 권한.

모든 파일은 읽기, 쓰기, 실행에 대한 접근 권한 보유.

읽기, 쓰기, 실행에 대해 가능/불가능으로 설정.

파일에 대한 접근 권한은 사용자 유형에 따라 다르게 설정 - 소유자/소유자와 같은 그룹의 사용자/기타 사용자.

 

 

> 유닉스 사용

- 유닉스 서버 접속: ssh, telnet등을 사용해 서버에 접속. 보안상 telnet 거의 사용X.

- 리눅스 설치: PC에 설치하거나/VMware와 같은 가상 기계에 설치하거나.

- Cygwin 사용: 윈도우에서 유닉스와 유사한 환경 제공.

 

! Cygwin 설치

 

$표시는 prompt라고 하는 것: UNIX 명령어 입력을 대기하고 있음을 표시

 

 

 

01. 기본적인 유닉스 명령어

1. 파일 및 디렉토리 관련 명령어

 

> 파일 종류

- 일반 파일: 데이터를 가지고 있으면서 디스크에 저장.

- 디렉토리(=윈도우의 폴더): 디렉토리에 포함된 파일(디렉토리 포함)들의 목록을 저장하는 파일. 일반 파일과 마찬가지로 디스크에 저장.

- 스페셜 파일: 각종 I/O 장치들을 나타내는 파일. I/O 장치를 파일과 동일한 방법으로 사용할 수 있게 함. 

 

> 디렉토리 구조: 유닉스의 디렉토리는 root(/)로부터 시작해 tree모양의 계층 구조를 이룬다.

- root 디렉토리: 디렉토리 구조의 제일 꼭대기에 있는 디렉토리.

- home directory: 각 사용자마다 홈 디렉토리 소유. 사용자 계정을 만들 때 설정. 처음 접속할때 들어가게 되는 디렉토리로 사용자별로 홈 디렉토리는 다르다.

- current working directory(cwd): 현재 작업중인 디렉토리. 로그인하면 홈 디렉토리가 cwd가 된다. cd명령을 사용해 cwd를 변경한다.

 

 

> 디렉토리와 경로명

>> 절대 경로와 상대 경로

- 경로명(pathname): 파일 시스템 내에서 파일의 위치를 알려준다.

 

- 절대 경로명(absolute pathname): 루트 디렉토리를 기준으로 파일의 위치를 표현. 루트 디렉토리의 위치는 고정되어 있기 때문에 한 파일에 대한 절대 경로 또한 유일하다.

 

- 상대 경로명(relative pathname): 현재 디렉토리(cwd)를 기준으로 파일의 위치를 표현. 현재 디렉토리의 위치는 변경이 가능하므로 한 파일에 대한 상대 경로는 여러개가 가능. 동일한 상대 경로라 하더라도 cwd에 따라 다른 파일을 가리킬 수 있음.

 

+ 상대 경로명에서 "."는 현재 디렉토리, ".."는 부모 디렉토리 의미.

+ "~"는 홈 디렉토리 의미.

 

 

> 디렉토리 관련 명령어

- pwd(print working directory): 현재 작업중인 디렉토리를의 경로를 출력.

 

- cd(change directory): cwd(current working directory)를 변경.

인자를 명시하지 않으면 홈 디렉토리로 이동. 

 

* $ cd /usr/local: 절대경로 <-> $ cd usr/local

/가 없으면 ./가 생략되어 있는 상태(cwd부터 시작한다는 뜻)

 

- mkdir(make directory): 새 디렉토리를 생성.

ex. $ mkdir test   새 디렉토리를 생성

$ mkdir test/data   test디렉토리 밑에 data라는 디렉토리 생성

$ mkdir /tmp/data   절대경로tmp 밑에 이하생략.

 

- rmdir(remove directory): 빈 디렉토리를 삭제. 단, 디렉토리가 비어있어야만 삭제 가능.

 

- ls(list): 디렉토리의 파일 목록을 보여준다.

$ ls   현재 디렉토리의 파일 목록을 보여준다.

$ ls -a   히든파일(.으로 시작한다 + 디렉토리 생성시 .과 ..를 기본으로 보유)까지 보여준다.

$ ls -l   길게 보여준다. 

 

 

> 파일 관련 명령어

- cat(concatenate): 주어진 파일의 내용을 화면으로 출력.

$ cat readme1.txt readme2.txt   2개 이상 가능.

$ cat readme1.txt > aaa   파일 내용을 aaa로 보낸다.

 

-> more: 주어진 파일의 내용을 페이지 단위로 화면으로 출력. 

$ cat readme.txt | more   ("|"=파이프)

$ more readme.txt

$ a.out | more

 

- wc(word count): 주어진 파일의 줄, 단어, 문자의 개수를 출력.

 

- head: 파일의 앞부분(10줄)을 출력.

$ head -30 readme.txt   30줄을 출력.

 

- tail: 파일의 뒷부분(10줄)을 출력.

$ tail -20 readme.txt   20줄을 출력.

 

- cp(copy): 파일을 복사.

-> $ cp 파일1 파일2 : 파일 1의 복사본 파일 2를 생성.

$ cp readme.txt aaa   파일을 현재 디렉토리에 aaa라는 이름으로 복사.

$ cp readme.txt /tmp/bbb   파일을 경로 /tmp아래 bbb란 이름으로 복사.

 

-> $ cp 파일 디렉토리 : 파일1의 복사본을 디렉토리에 생성.

$ cp readme.txt /tmp   경로 /tmp에 파일을 복사.

 

- mv(move)

-> $ mv 파일1 파일2 : 파일1의 이름을 파일2로 변경.

$ mv readme.txt readme   파일1의 이름을 파일2로 변경.

$ mv readme.txt ~/tmp/readme   파일1을 ~/tmp로 이동 + 및 readme란 이름으로 변경

 

-> $ mv 파일 디렉토리 : 파일을 디렉토리로 이동.

$ mv readme.txt ~/tmp

 

- rm(remove): 주어진 파일을 삭제

$ rm readme.txt

 

-> $ rm -r 디렉토리 : 디렉토리 내의 모든 파일&하위 디렉토리들을 삭제.

빈 디렉토리가 아니더라도 디렉토리가 삭제되므로 조심해서 사용.

 

 

> 파일 특징

$ ls -l a.c

-rw-r--r--(접근권한) 1 shim(owner) faculty(group) 1234(size) 3월 7일 15.24(수정시간) a.c

 

1. 파일 종류

- : 일반 파일

d : 디렉토리

p : 파이프

c : 캐릭터 스페셜 파일

b : 블록 스페셜 파일

l : 심볼릭 링크

 

2. 접근권한

r : 읽기 권한 : 디렉토리 내의 파일 목록에 대한 읽기 권한

w : 쓰기 권한 : 디렉토리 내의 새로운 파일 생성 또는 삭제 권한

x : 실행 권한 : 디렉토리로 cd할 수 있는 권한

+ usre/group/others 차례로 사용자 접근권한 서술.

 

 

> 파일 특성 관련 명령어

- chmod(change mode)

-> $ chmod [u|g|o|a] + [+|-] [r|w|x] + files : 파일/디렉토리의 접근권한을 변경.

! 이때 a는 모두에게 / +-는 더하기 빼기

$ chmod g+rw readme.txt   파일의 그룹에 r, w의 접근권한 추가.

$ chmod 764 readme.txt a.cpp : 각 접근권한 허용을 1, 비허용을 0으로 두고 111 + 110 + 100 = 764로 변경.

 

- chown(change owner)

-> $ chown 사용자명 파일 : 파일/디렉토리의 owner를 지정된 사용자로 변경.

 

- chgrp(change group)

-> $ chgrp 그룹명 파일 : 파일/디렉토리의 group을 지정된 그룹으로 변경.

 

 

 

> Redirection

- 표준 출력: 화면으로부터 출력하는 것.

- 표준 입력: 키보드로부터 읽어 들이는 것.

- 표준 출력 및 표준 입력을 파일로 변경하는 것: redirection.

 

> Output redirection

- $ 명령어 > 파일 : 화면으로 나와야 할 명령어 실행 결과가 지정된 파일에 저장. (지정된 파일은 새로 생성)

$ ls -l > user.txt

$ a.out > output

 

- $ 명령어 >> 파일 : 화면으로 나와야 할 명령어 실행 결과가 지정된 파일의 끝에 추가된다. (생성X)

$ ls -l >> output

$ a.out >> output

 

> Input redirection

- $ 명령어 < 파일 : 키보드로부터 읽어 들이는 대신 파일로부터 읽어 들인다.

$ a.out < data

 

 

> pipe: 한 명령어의 표준 출력을 다음 명령어의 표준 입력으로 '연결'할 수 있게 한다.

$ cat a.c b.c c.c | more

 

$ who > user.list

$ sort user.list

 

$ who | sort

$ who | sort | more

 

 

> process 관련 명령어: 실행중인 프로그램을 프로세스라고 하고, 각 프로세스는 유일한 식별 번호인 pid를 가진다.

- ps 명령어

-> $ ps : 실행중인 프로세스를 보여준다.

-> $ ps aux : 모든 프로세스를 다 보여준다. 

 

- kill 명령어: 지정된 pid를 가진 프로세스를 강제로 종료시킨다.

$ kill 8720 (send SIGTERM) : 옵션 없이 주면 3번이 자동 선택.

$ kill -9 8720 (send SIGKILL) : -9=시그널. 시그널 분류를 위해 번호 붙임. 그러나 번호보다 명령어가 알아보기 쉽다.