2011-07-23 72 views
2

是否可以通過目標文件的mmaped區域將源文件進行mmap映射以將源複製到目標?我已經嘗試了簡單的實現(下圖),但它不工作..使用mmap複製文件

int main(int argc, char *argv[]) 
{ 
    struct stat ss; 
    int src = open(argv[1], O_RDONLY); 

    fstat(src, &ss); 

    int dest = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, ss.st_mode); 

    void *dest_addr = mmap(NULL, ss.st_size, PROT_WRITE, MAP_SHARED, dest, 0); 
    printf("dest is: %x\n", dest_addr); 

    void *src_addr = mmap(dest_addr, ss.st_size, PROT_READ, MAP_PRIVATE | MAP_FIXED, src, 0); 
    printf("src is: %x\n", src_addr); 

    if (munmap(dest_addr, ss.st_size)) 
     printf("munmap failed"); 

    if (munmap(src_addr, ss.st_size)) 
     printf("munmap failed"); 
} 

上述映射源「在」目的地MMAP,但是這並不能使其一路下跌到實際的文件作爲希望。我只是天真嗎?

回答

3

將兩個文件映射到同一個內存區域是有問題的。這個內存的內容應該是什麼,來自第一個文件或第二個文件的數據還是混合數據?這不起作用。

你可以做的是將兩個文件和memcpy從一個映射區域映射到另一個映射區域。但請注意,最好先創建文件並設置其長度,否則mmap可能會返回SIGBUS(請參閱文檔)。

SIGBUS嘗試訪問 對應文件不適用的緩衝器的一部分(例如,超出文件, 的端部包括其中另一個進程已截斷該文件的情況下)。