利用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...