- 유닉스의 역사
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=시그널. 시그널 분류를 위해 번호 붙임. 그러나 번호보다 명령어가 알아보기 쉽다.
'강의 정리 > 시스템 프로그래밍' 카테고리의 다른 글
시스템 프로그래밍 (3) 리눅스 소개 2 (vi 편집기까지만 정리) (0) | 2024.03.29 |
---|---|
시스템 프로그래밍 (1) 소개 (0) | 2024.03.29 |