파일입출력을 사용함녀 파일을 열고 읽고 쓰며, 오프셋을 변화시키며 작업을 하게 됩니다.
이때 원하는 파일을 잘라내고 싶을 때가 있습니다. 그 때 사용하는 시스템 콜을 알아보겠습니다.
리눅스에서 특정한 파일을 잘라내기 위한 시스템 콜이 있습니다. 총 2가지인데요,
그 주인공은 truncate() 시스템 콜과 ftruncate() 시스템 콜입니다.
두 시스템의 공통점은 특정 파일의 데이터를 잘라 낸다는데 있습니다. 그럼 차이점이 뭘까요?
truncate()시스템 콜은 파일의 경로를 이용해서, ftuncate() 시스템 콜은 파일 디스크립터를
이용해서 파일의 데이터를 잘라 낸다는 것입니다.
두 함수를 한번 알아보겠습니다.
먼저, ftruncate() 시스템 콜입니다.
#include <unistd.h> #include<sys/types.h> int ftruncate (int fd, off_t len) | ||
입력 인자 | int fd | 잘라낼 파일의 디스크립터 |
off_t len | 잘라낼 파일의 데이터 길이 | |
반환값 | int | 성공 : 0 실패 : -1 |
ftruncate()는 파일 디스크립터를 이용한다고 말씀드렸습니다.
예제를 보면 더 쉽게 이해 할 수 있습니다.
위 소스를 보면 ftruncate()를 하기 위해 잘라내기 할 파일을 오픈합니다. 이 때 주의할 점은
잘라내기 할 파일은 항상 쓰기 모드로 열려야 한다는 것입니다.
위 소스를 실행시키면 아래와 같이 파일이 잘린 것을 확인할 수 있습니다.
두 번째, truncate() 시스템 콜입니다.
#include <unistd.h> #include<sys/types.h> int truncate (const char* path, off_t len) | ||
입력 인자 | const char* path | 잘라낼 파일의 경로 |
off_t len | 잘라낼 파일의 데이터 길이 | |
반환값 | int | 성공 : 0 실패 : -1 |
기능은 ftruncate()와 같으나 사용법은 다릅니다.
예제를 보시죠.
위 소스를 보면 파일을 열지 않고, 파일의 경로를 시스템 콜의 인자로 넘겨주는 것을 확인할 수 있습니다.
실행하면 아래와 같은 결과를 얻게 되죠.
두 시스템 콜은 잘라내는 것이 목적이므로, 현재 파일의 크기보다 작은 길이로만 잘라낼 수 있습니다.
여기서 len이 파일의 잘라낼 데이터의 길이라고 했는데요, 흔히 생각하면 그 만큼 파일을 잘라내 버리는 것이 아닌 실제 len만큼의 길이만 잘라내 보존한다라고 생각하시면 편할 것입니다.
그렇기에 위 시스템 콜들을 실행하면 파일의 길이는 len이 되는거죠.
다음 시간에는 앞에서 잠시 다뤘던 파일 입출력의 동기화, 즉 다중 입출력에 대해 한번 알아보겠습니다.
'Linux > System Programming' 카테고리의 다른 글
[프로세스 관리] 1. 프로세스의 ID 얻기 (0) | 2015.04.12 |
---|---|
[프로세스 관리] 0. 프로그램 / 프로세스 / 스레드 (0) | 2015.04.12 |
[파일입출력] 5. lseek()으로 파일 탐색하기 (0) | 2015.02.10 |
[파일입출력] 4. 동기식 입출력 (1) | 2015.02.04 |
[파일입출력] 3. write()로 파일에 쓰기 (2) | 2015.02.03 |