IT 그리고 정보보안/Knowledge base

리눅스 환경의 파일 관리

plummmm 2021. 4. 14. 13:29
반응형

파일을 관리하기 위한 여러가지 기능의 함수들에 대해 알아본다~~

 

파일 쪼개기

먼저 파일을 절단(?)할 때 사용하는 truncate() 계열 함수에 대해 알아보자.

open() 함수를 사용할 때 새로 파일을 만들때 O_TRUNC 옵션을 줬던걸 기억하는지..

이 truncate 함수를 이용해서 파일 자르는 경우의 일부라고 볼 수 있다.

(통째로 다 짤라 버린다는 말)

 

 

truncate와 ftruncate 두가지가 있는데, 앞서 공부한 함수들과 마찬가지로..

open된 파일에 대해 절단을 하려면 ftruncate 쓰면된다. 파일을 잘라서 파일의 크기를 length만큼 만드는 것.

 

하드링크 생성 및 삭제

link와 unlink에 대해 알아보자. 하드링크 파일을 만들고 링크 카운트를 줄이는 함수이다.

 

newpath에 파일이 존재한다면 오류를 반환한다.

디렉토리에 대한 링크는 관리자 권한일 때만 생성이 가능하다. (아예 하드링크를 금지하는 파일 시스템 구현도 많단다.)

하드 링크 때문에 시스템에 비정상적인 루프가 걸릴 수 있기 때문이다.

 

unlink 함수도 알아보자. 링크 카운트를 줄여서 기존 항목을 삭제하는 것이다.

 

unlink를 수행하기 위해선 해당 디렉토리에 대한 쓰기, 실행 권한이 필요하다.

unlink를 수행하면 파일이 삭제되고 링크 되어있던 파일의 링크 카운트는 1 줄어들 것이다.

이게 unlink를 실행해서 카운트가 0이되면 파일 내용이 실제로 삭제되는 것.

 

unlink() 도 파일을 삭제하는 함수인데, remove와 차이가 좀 있다. remove()에 대해 알아보자.

 

unlink함수는 디렉토리에 대한 삭제는 불가능했다.

하지만 remove는 다 삭제됨.

삭제 대상이 정규 파일일 때는 unlink()가 호출 되고 디렉토리 일때는 rmdir()이 호출 된다.

remove() = unlink() + rmdir() 이라고 보면 된다.

 

 

심볼릭링크

하드 링크에 대한 내용을 알아봤으니, 이제 심볼릭링크에 대한 함수들을 알아보자.

심볼릭 링크를 생성하는 symlink()와 심볼릭 링크 파일을 읽는 readlink() 이다.

 

먼저 symlink()에 대해 알아보자.

 

함수 호출이 성공하면 actualpath 를 가르키는 파일이 sympath 경로로 생성된다.

actualpath에 파일이 존재하지 않아도 심볼릭 링크는 생성 가능하다.

대신 cat으로 읽으려고 하면 불가능..

 

 

symlink로 생성한 파일을 오픈하면 원본파일이 오픈되는데,

링크 파일 자체를 읽어오고 싶을 때 사용하는 함수가 또 있다.

 

readlilnk이다.

 

buf에 읽어온 내용을 저장하고 읽은 바이트 만큼 리턴값을 반환한다.

 

파일이름 변경

파일이나 디렉토리의 이름을 변경할 때 사용하는 rename() 함수를 알아보자.

 

oldname과 newname은 모두 같은 파일시스템에 있어야 한다.

이 파일은 oldname이 뭐냐에 따라 여러가지 동작을 한다.

 

1. oldname이 정규파일 or 심볼릭 링크 파일일 때,

- newname이 디렉토리가 아니고 이미 존재한다면, 그것은 제거되고 oldname이 newname으로 바뀐다.

   (oldname과 newname을 담은 디렉토리에 쓰기 권한이 필요하다.)

 

2. oldname이 디렉토리일 때,

- newname은 반드시 디렉토리여야 하고, 비어있어야 한다. 역시나 이미 디렉토리가 있고 비어있으면

   그것은 제거되고 oldname이 newname으로 바뀐다.

 

3. oldname 또는 newname이 기호 링크를 가르킬 때,

- 링크가 가르키는 파일이 아니라 링크파일 자체가 처리된다.

 

4. oldname과 newname이 같은 파일일 때,

- 아무 변화도 없고 함수가 성공을 반환한다.

 

 

파일 시간 변경

파일의 시간을 변경하는 utime함수에 대해 알아보자.

기본적인 파일의 시간에 대한 내용을 따로 포스팅해두었다.

 

utime함수는 pathname에 있는 파일의 시간을 utimbuf라는 구조체를 참조하여

구조체 안에 값대로 변경한다. utimbuf는 아래와 같음.

 

actime은 접근 시간, modtime은 수정 시간이다.

*times 포인터가 가르키는 utimbuf 구조체에 있는 위 두값 대로 변경됨.

 

*times 가 NULL 포인터를 가르킨다면, actime과 modtime은 현재 시간으로 갱신된다, 

 

그럼 ctime은 변경이 불가능한가??

utime이 실행되면 ctime은 자동으로 갱신된다.

 

예제코드를 보자.

파일을 열어 인자로 받는 파일에 대해, st_atime과 st_mitme 즉, 최종 접근, 수정시간으로

리셋 하는 예제코드이다. 실행을 하면 아래와 같다.

 

나머지는 타임리셋 한것이라 변화는 없고

마지막 ctime은 바뀌어 있다. utime이 실행되면 자동으로 갱신된다고 했었다.

우리가 조절하는게 아니다. 커널이 조절하는 것임.

 

반응형