利用mmap實現的乙個檔案拷貝例子

2021-08-21 09:39:59 字數 2108 閱讀 8972

利用mmap實現的乙個檔案拷貝例子

/** gcc -wall -o3 -o copy_mmap copy_mmap.c

*/#include 

<

stdio.h

>

#include 

<

stdlib.h

>

#include 

<

string

.h>

/*for memcpy 

*/#include 

<

strings.h

>

#include 

<

sys/

mman.h

>

#include 

<

sys/

types.h

>

#include 

<

sys/

stat.h

>

#include 

<

fcntl.h

>

#include 

<

unistd.h

>

#define

perms 0600

intmain ( 

intargc, 

char

*argv )

if( ( src 

=open( argv[

1], o_rdonly ) ) 

<0)

/*為了完成複製,必須包含讀開啟,否則mmap()失敗 

*/if

( ( dst 

=open( argv[

2], o_rdwr 

|o_creat 

|o_trunc, perms ) ) 

<0)

if( fstat( src, 

&statbuf ) 

<0)

/** 參看前面man手冊中的說明,mmap()不能用於擴充套件檔案長度。所以這裡必須事

* 先擴大目標檔案長度,準備乙個空架子等待複製。

*/if

( lseek( dst, statbuf.st_size -1

, seek_set ) 

<0)

if( write( dst, 

&statbuf, 1) 

!=1) 

/*讀的時候指定 map_private 即可 

*/sm 

=mmap( 

0, ( size_t )statbuf.st_size, prot_read,

map_private 

|map_noreserve, src, 0);

if( map_failed 

==sm )

/*這裡必須指定 map_shared 才可能真正改變靜態檔案 

*/dm 

=mmap( 

0, ( size_t )statbuf.st_size, prot_write,

map_shared, dst, 0);

if( map_failed 

==dm )

memcpy( dm, sm, ( size_t )statbuf.st_size );

/** 可以不要這行**

** msync( dm, ( size_t )statbuf.st_size, ms_sync );

*/return

( exit_success );

} mmap()好處是處理大檔案時速度明顯快於標準檔案i/o,無論讀寫,都少了一次使用者空間與核心空間之間的複製過程。操作記憶體還便於設計、優化演算法。

檔案i/o操作/proc/self/mem不存在頁邊界對齊的問題,但至少linux的mmap()的最後乙個形參offset並未強制要求頁邊界對齊,如果提供的值未對齊,系統自動向上捨入到頁邊界上。malloc()分配得到的位址不見得對齊在頁邊界上。

/proc/self/mem和/dev/kmem不同。root使用者開啟/dev/kmem就可以在使用者空間訪問到核心空間的資料,包括偏移0處的資料,系統提供了這樣的支援。顯然**段經過/proc/self/mem可寫對映後已經可寫,無須mprotect()介入。

from:

使用mmap實現檔案的拷貝

mmap與munmap函式介紹 include include void mmap void start,size t length,int prot,int flag,int fd,off t offset 返回 若成功時則返回對映區域的指標,若出錯則為map failed 1 start 最好從...

實現乙個深拷貝

第一種 可以使用簡單的方法jsonconst person const copyperson json.parse json.stringify person 修改person內name屬性 person.name che console.log person console.log copyper...

利用CoreAnimation實現乙個時間的進度條

那麼接下來就是如何用coreanimation實現乙個進度條控制項了。首先呢,讓我們建立乙個繼承自cashapelayer的wkprogressbarlayer。wkprogressbarlayer預設自身的bounds就是整個進度條的大小。inte ce wkprogressbarlayer ca...