#include
#include
#include /* for memcpy */
#include
#include
#include
#include
#include
#include
#define PERMS 0600
int main ( int argc, char * argv[] )
{
int src, dst;
void * sm, * dm;
struct stat statbuf;
if ( argc != 3 )
{
fprintf( stderr, " Usage: %s \n " , argv[ 0 ] );
exit( EXIT_FAILURE );
}
if ( ( src = open( argv[ 1 ], O_RDONLY ) ) < 0 )
{
perror( " open source " );
exit( EXIT_FAILURE );
}
/* 為了完成復制,必須包含讀打開,否則mmap()失敗 */
if ( ( dst = open( argv[ 2 ], O_RDWR | O_CREAT | O_TRUNC, PERMS ) ) < 0 )
{
perror( " open target " );
exit( EXIT_FAILURE );
}
if ( fstat( src, & statbuf ) < 0 )
{
perror( " fstat source " );
exit( EXIT_FAILURE );
}
/*
* 參看前面man手冊中的說明,mmap()不能用於擴展文件長度。所以這裡必須事
* 先擴大目標文件長度,准備一個空架子等待復制。
*/
if ( lseek( dst, statbuf.st_size - 1 , SEEK_SET ) < 0 )
{
perror( " lseek target " );
exit( EXIT_FAILURE );
}
if ( write( dst, "a", 1 ) != 1 )
{
perror( " write target " );
exit( EXIT_FAILURE );
}
/* 讀的時候指定 MAP_PRIVATE 即可 */
sm = mmap( 0 , ( size_t )statbuf.st_size, PROT_READ,
MAP_PRIVATE | MAP_NORESERVE, src, 0 );
if ( MAP_FAILED == sm )
{
perror( " mmap source " );
exit( EXIT_FAILURE );
}
/* 這裡必須指定 MAP_SHARED 才可能真正改變靜態文件 */
dm = mmap( 0 , ( size_t )statbuf.st_size, PROT_WRITE,
MAP_SHARED, dst, 0 );
if ( MAP_FAILED == dm )
{
perror( " mmap target " );
exit( EXIT_FAILURE );
}
memcpy( dm, sm, ( size_t )statbuf.st_size );
/*
* 可以不要這行代碼
*
* msync( dm, ( size_t )statbuf.st_size, MS_SYNC );
*/
return ( EXIT_SUCCESS );
}
上面是一個復制文件的C程序,請問其中的代碼
if ( write( dst, "a", 1 ) != 1 )
{
perror( " write target " );
exit( EXIT_FAILURE );
}
寫入的a為什麼在復制的的文件裡找不到???
A之前是加到文件最後了,放在 (statbuf.st_size - 1) 的位置上, 之後你不是用map copy了嗎?就把這個位置的內容覆蓋了。