이번 챕터에서는 리눅스 시스템 프로그래밍에 대한 다양한 개념이 소개되어 있다.
시스템에서 각 사용자는 고유하게 식별되고, 사용자들은 그룹에 속해있을 수 있다.
시스템에서 각 사용자는 고유한 login (username) 과 numeric user ID (UID) 를 갖게 된다. 아래의 추가 정보 역시 포함된다.
초창기 UNIX에서는, 하나의 사용자는 하나의 그룹만 가입할 수 있었다. BSD UNIX에서는 하나의 사용자가 여러 그룹에 가입할 수 있게 허용했고, 그 이후에 POSIX에서 이를 채택하였다.
root 라는 이름의 사용자이다. UID가 0이며, 시스템에 관한 특별한 권한을 가지고 있다. 일반 UNIX 시스템에서 슈퍼유저는 시스템에서 체크하는 모든 권한을 우회할 수 있다. 슈퍼유저는 모든 파일에 접근 가능하며, 모든 사용자 프로세스에 시그널을 보낼 수 있다. 보통 관리자의 역할을 한다.
커널은 시스템 안의 모든 파일을 정리하기 위해 하나의 계층적 데이터 구조를 유지한다. (이것은 Microsoft Windows와 대비되는데, Windows에서는 각각의 디스크가 각각의 디렉토리 계층을 가지고 있기 때문이다.) 이것을 단일 디렉토리 계층 (Single Directory Hierarchy)라 부른다.
리눅스의 디렉토리 계층은 root 디렉토리로부터 시작하는데 이것을 / 로 표현한다. 모든 파일과 디렉토리는 root 디렉토리의 자식이다.
디렉토리는 내용이 해당 파일에 대한 참조와 결합된 파일 이름 테이블 형식의 특수한 파일이다. 즉, 디렉토리도 파일의 일종이다. 파일 이름과 참조를 묶은 것을 링크(link) 라고 한다.
디렉토리는 파일을 연결하는 링크 또는 디렉토리를 연결하는 링크 둘 다 가질 수 있다. 흔히 인식하는 폴더로 받아들이면 될 듯함.
모든 디렉토리는 적어도 두 개의 출입구를 가진다. . (dot) 은 해당 디렉토리 스스로를 가리키는 링크다. .. (dot-dot) 은 부모 디렉토리(계층 위)로 향하는 링크다. 루트 디렉토리를 제외한 모든 디렉토리에는 부모 디렉토리가 존재한다.
노멀 링크(normal link)와 비슷하게, 심볼릭 링크는 어떤 파일에 대한 다른 이름(alternative name)을 제공한다. 하지만 노멀 링크는 파일 이름 + 포인터 인 반면, 심볼릭 링크는 단순히 가리키는 파일 이름만 들어있다.
종종 노멀 링크를 하드 링크 (hard link)로, 심볼릭 링크를 소프트 링크 (soft link)로 칭하곤 한다.
대부분의 리눅스 파일 시스템에선 파일 이름은 최대 255 글자까지 가능하다. 파일 이름에 대한 규칙도 있는데, 특수 문자의 경우, 쉘에서 정규식 등으로 쓰이기 때문에 파일 이름으로 쓰이지 못한다.
여기서는 절대 경로 (absolute pathname)과 상대 경로 (relative pathname) 정도만 알아가면 될 듯 하다.
절대 경로
/ 로 시작하는 경로. 루트 디렉토리부터 시작하기 때문에 절대 경로이다.
/home/mtk/.bashrc
/usr/include
상대 경로
프로세스의 현재 작업 디렉토리와 연관된 경로. 위의 Figure 2-1에서 usr 디렉토리의 경우, types.h 파일의 경우 include/sys/types.h 의 상대 경로를 가진다.
각 프로세스는 현재 작업 디렉토리를 가지게 된다. 이것이 바로 프로세스의 "현재 위치"이다.
쉘의 현재 작업 디렉토리는 cd 명령어를 통해서 바꿀 수 있다.