mmapでファイルコピー

mmapを利用して、効率良くファイルをコピー。通常ファイルが標準入力にリダイレクトされていることを想定。

#include < sys/mman.h >
#include < sys/types.h >
#include < unistd.h >
#include < stdio.h >

int main(){
    off_t p, file_size;
    size_t pagesize, len;
    char *mp;
    
    pagesize = getpagesize();
    
    if ((file_size = lseek(0, 0, SEEK_END))<0){
        perror("lseek");
        return 1;
    }
    
    len = pagesize;
    for(p = 0; p < file_size; p += len){
        if (file_size - p < pagesize){
            len = file_size - p;
        }
        
        if ((mp = mmap(0, len, PROT_READ,MAP_PRIVATE, 0, p))== MAP_FAILED){
            perror("mmap");
            return 1;
        }
        write(1, mp, len);
        if (munmap(mp, len)< 0){
            perror("munmap");
            return 1;
        }
    }
    return 0;
}