본문 바로가기

C

[시스템프로그래밍] File Handling, Files in multi-user environment

3-1. File Handling

UNIX File Primitives

  • open - 읽기, 쓰기, 생성을 위해 파일을 열기
  • create - 빈 파일 생성
  • close - 열린 파일 닫기
  • read - 파일에서 정보 가져오기
  • write - 파일에다 정보 쓰기
  • lseek - 읽기/쓰기 포인터의 위치를 이동
  • unlink - 파일 삭제 (빈 디렉터리 삭제 불가)
  • remove - 파일 삭제 (빈 디렉터리 삭제 가능)
  • fcntl - 파일 컨트롤

File Structure

배열에 index 가 있는 것처럼, 파일도 offset 이라는 위치가 있다

원래 파일 내용 뒤에 내용을 추가(appending)할 땐 offset이 EOF이 됨

UNIX File System Model

3가지의 파일 타입이 있다

Regular files - 위 사진과 같이 파일 내용이 바이트들의 배열구조에 저장된다

directory files - 트리 구조(파일끼리의 위계가 존재)

special files - 그 외의 파일들

Device driver and Kernel

디바이스 드라이버 : 실제 장치를 다루는 커널의 일부분

커널은 일반 사용자가 접근할 수 없고, 프로그램이 동작할 때 내부적으로 함수 호출을 사용한다.

커널 영역의 디바이스 드라이버는 System Call 을 인터페이스로 이용함으로써 하드웨어를 제어한다.

Structure of Disk File

  • Directory
    • file name
    • i-node number
  • i-node
    • 리눅스/유닉스 시스템에서 모든 파일들에 할당되는 고유의 번호
    • file속성(owner, rwx, date)
    • sector numbers
  • Sector
    • 실제 데이터가 저장되는 곳

디렉터리는 i-node를 가지고 있고, i-node는 sector number를 가지고 있는 구조

file descriptor

시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값

프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스

  • Index 0: stdin
  • Index 1: stdout
  • Index 2: stderr

프로세스가 실행 중에 파일을 Open 하면

커널은 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다.

그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, FD 값을 이용해 파일을 지칭한다.

shell redirection

< : 표준입력을 file로

> : 표준출력을 file로

2> : 표준에러를 file로

 

예시)

$ cat > a.txt

This is a a.txt

를 입력하면 a.txt 파일에 써진다

 

$ cat sample.txt none.txt 2> res.txt

none.txt 가 없는 파일이라고 한다면, res. txt은 다음과 같다.

none.txt: 그런 파일이나 디렉터리가 없습니다.

filter

| : 먼저 수행된 연산(왼쪽)의 결과가 다음연산(오른쪽)의 입력값으로 연결되는 것

 

예시)

ls -al | grep "txt"
"txt" 문자열이 포함된 파일만 보여줌


3-2. Files in multi-user environment

System desingn

유저들을 분별할 수 있는가?

유저들이 서로 파일을 공유하게 할 것인가?

다른 시스템에 유저가 접근할 수 있게 할 것인가?

관리자 권한을 줄 것인가?

등등을 고려해야 한다.

User

  • Unix : 멀티유저 환경
  • user는 uid를 가짐 -> 유저를 식별할 수 있음
  • /etc/passwd 는 login name과 uid를 갖고 있다.

Group

  • user의 집합
  • gid를 가짐.
  • 한 유저는 동시에 여러 그룹에 속할 수 있다.
  • /etc/group 은 group name과 gid를 갖고 있다.
    • /etc/group 파일에서 특정 그룹에 uid가 속하면 유저는 그 그룹에 속한다.

같은 그룹이라고 해서 다른 user의 파일에 맘대로 접근할 수 있는 것은 아니다.

File permissions

Owner : 파일을 소유한 user

Group : 특정 그룹에 소속된 user

Others :  그 외 user

 

각 3가지 부류에 Read, Write, Execute 권한이 부여된 것을 다음과 같이 확인할 수 있다.

 

Command: chmod

$ chmod [options] [mode] [file]

파일 접근 권한을 바꾸는 명령어

mode 지정하는 방법 2가지

1. 8진수 사용

$ chmod 755 myfile.c

rwx r-x r-x

- 소유자: 모든 권한

- 그룹 및 그 외 사용자: 읽기, 실행

 

2. 기호 사용

go+w : 그룹 및 그 외 사용자에게 읽기 권한 부여

System call: open()

int fd = open(const char * path, int oflags, int mode);

 

oflags가 O_CREAT일 때, 즉 파일을 생성할 때 파일의 mode 를 지정해줄 수 있다.

이것도 2가지 방법으로 mode를 지정해줄 수 있다.

 

1. 직접 octal(8진수)를 mode에 쓰는 방법

0644 -> (110 100 100) -> rw- r-- r--

 

2. <sys/stat.h> 에 있는 허가 상수 사용

Super-user, effective id

super-user는 root를 뜻한다.

파일에 대한 모든 권한을 가진다.

 

$su: 사용자를 변경할 때 쓰는 명령어
su - root 또는 su -
: super user로 전환

su -[username]
: 일반 사용자로 활동

Link

  • 하드 링크
    • 선택한 파일의 사본 역할
    • 원본 파일이 삭제되더라도 하드 링크에는 여전히 해당 파일의 데이터가 포함되어 있다.
    • 원본 파일과 동일한 inode 번호를 가진다.
  • 소프트 링크
    • 파일 이름에 대한 포인터(참조) 역할을 합니다.
    • 원본 파일/디렉터리가 삭제되거나 이동할 경우 소프트 링크는 더이상 존재하지 않는 파일/디렉터리를 가리키게 되어 동작하지 않게 됩니다.
    • 원본 파일/디렉터리와는 다른 inode 번호를 가진다.

symbolic link

링크를 가리키는 링크

소프트 링크에 속한다

symlinked는 mine.c를 가리키고 있고, mine.c는 i-node #1256를 가리키는 링크이기 때문에

symlinked는 링크의 링크, 즉 심볼릭 링크다.

 

만약 symlinked가 가리키는 mine.c파일이 사라진다면, #1256의 데이터는 삭제되는 것인가?

아니다. #1256을 가리키는 또다른 링크 yours.c파일이 있기 때문에 #1256은 존재한다.

System call: fstat()

  • 파일에 대한 정보를 가져오는 system call
    • 성공 시 0, 실패 시 -1

struct stat은 파일에 대한 정보를 갖고 있다.

 

'C' 카테고리의 다른 글

[시스템프로그래밍] ch.4 pwd 복습  (0) 2023.10.26
[시스템프로그래밍] ls 명령어 구현 (-al, -alR)  (0) 2023.10.13