Heesung Yang

내가 원하는 크기로 파일 생성하기 (테스트용 Dummy 파일)

  • truncate 라는 명령어가 있음 ( coreutils rpm package )

  • truncate -s 24m example.file 와 같은 식으로 사용

  • example.file 이 없는 경우 24m 짜리 빈 파일이 생성됨

  • 이 파일은 sparse file이라 부르며 (https://en.wikipedia.org/wiki/Sparse_file) disk 용량 차지를 안함

  • 테스트 시 유용

  • centos 5 에는 truncate 유틸이 없음

  • strace 로 분석해서 직접 만들어 봄

~$ strace -f truncate -s 10241024 testfile
execve("/usr/bin/truncate", ["truncate", "-s", "10241024", "testfile"], [/* 24 vars */]) = 0
brk(NULL)                               = 0x1fdc000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f731e9f4000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=18965, ...}) = 0
mmap(NULL, 18965, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f731e9ef000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\35\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2127336, ...}) = 0
mmap(NULL, 3940800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f731e411000
mprotect(0x7f731e5c9000, 2097152, PROT_NONE) = 0
mmap(0x7f731e7c9000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b8000) = 0x7f731e7c9000
mmap(0x7f731e7cf000, 16832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f731e7cf000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f731e9ee000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f731e9ec000
arch_prctl(ARCH_SET_FS, 0x7f731e9ec740) = 0
mprotect(0x7f731e7c9000, 16384, PROT_READ) = 0
mprotect(0x60b000, 4096, PROT_READ)     = 0
mprotect(0x7f731e9f5000, 4096, PROT_READ) = 0
munmap(0x7f731e9ef000, 18965)           = 0
brk(NULL)                               = 0x1fdc000
brk(0x1ffd000)                          = 0x1ffd000
brk(NULL)                               = 0x1ffd000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106070960, ...}) = 0
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7317ee8000
close(3)                                = 0
open("testfile", O_WRONLY|O_CREAT|O_NONBLOCK, 0666) = 3
ftruncate(3, 10241024)                  = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
  • strace 결과를 보면 마지막 6번째 줄에 ftruncate(3, 10241024) 가 보임

  • ftruncate 검색

  • 다음과 같은 sample 코드 작성 및 테스트 성공!

    #include <unistd.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <stdio.h>
    
    void printUsage(){
        printf("Usage:\n");
        printf("./mkdm <file name> <file size>\n");
    }
    
    int main(int argc, char *argv[]){
    
        int fd;
    
        if(argc != 3){
            printUsage();
            return 1;
        }
    
        fd = open(argv[1], O_WRONLY|O_CREAT|O_NONBLOCK, 0666);
    
        char *p;
        long fs = strtol(argv[2], &p, 10);
    
        ftruncate(fd, fs);
        close(fd);
    
        return 0;
    }
    
  • 사용법

    ~$ gcc trucate.c -o mkdm
    ~$ ./mkdm test.file 10241024
    ~$ ls -l test.file
    -rw-r--r-- 1 root root 10241024 May 30 07:10 test.file