用mmap對映兩個檔案,然後把乙個檔案的內容複製到另乙個檔案
採用的是memcpy函式
但是使用這個函式出現了匯流排錯誤
我把兩個對映的位址和長度都輸出來了
請高手給分析一下。
輸出結果:
file size = 18
src = 0xb7fa9000
dst = 0xb7fa8000
匯流排錯誤
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv)
if((fdin = open(argv[1],o_rdonly)) == -1)
if((fdout = open(argv[2],o_rdwr | o_creat | o_trunc,0644)) == -1)
if(fstat(fdin,&statbuf) < 0)
printf("file size = %d\n",statbuf.st_size);
if(lseek(fdout,statbuf.st_size - 1,seek_set) == -1)
printf("file size = %d\n",statbuf.st_size);
if(lseek(fdout,statbuf.st_size - 1,seek_set) == -1)
if((src = mmap(0,statbuf.st_size,prot_read,map_shared,fdin,0)) == map_failed)
printf("src = 0x%x\n",src);
if((dst = mmap(0,statbuf.st_size,prot_read | prot_write,map_shared,fdout,0)) == map_failed)
printf("dst = 0x%x\n",dst);
memcpy(dst,src,statbuf.st_size);
close(fdin);
close(fdout);
exit(0);}
------------------------------------
#include
#include
#include
#include
<
string
.h>
#include
#include
#include
#include
int main(
int argc,
char
*argv)
if((fdin=
open
(argv[1]
,o_rdonly)
)<0)
/*開啟原檔案*/
perror
(argv[1]);
if((fdout=
open
(argv[2]
,o_rdwr|o_creat|o_trunc)
)<0)
/*建立並開啟目標檔案*/
perror
(argv[2]);
if(fstat(fdin,
&statbuf)
<0)
/*獲得檔案大小資訊*/
printf
("fstat error");
if(lseek(fdout,statbuf.st_size-1,
seek_set)=
=-1)
/*初始化輸出對映儲存區*/
printf
("lseek error");
if(write
(fdout,
"1",1)
!=1)
printf
("write error");
if((src=mmap(0,statbuf.st_size,prot_read,map_shared,fdin,0))=
=map_failed)
printf
("mmap error");
if((dst=mmap(0,statbuf.st_size,prot_read|prot_write,map_shared,fdout,0))=
=map_failed)
printf
("mmap error");
memcpy
(dst,src,statbuf.st_size)
;/*複製對映儲存區*/
munmap(src,statbuf.st_size)
;/*解除輸入對映*/
munmap(dst,statbuf.st_size)
;/*解除輸出對映*/
close
(fdin)
; close
(fdout)
; return 0;}[
/code]
lz的問題只是沒加紅色的哪條語句...
.如果加,當寫入資料的時候會遇到檔案結束符,產生sigbus訊號
用ftruncate函式可以代替lseek函式更好些
但是從lz輸出的的src和dst位址來看
它是頁對齊的
只是lseek函式使用不是很正確
在lseek之後加上一條i/o操作的話 就正確了
這個bus error 似乎在這裡面得不到很好體吧
不知道為什麼會報bus error錯誤
原帖由 eclipse_2 於 2009-4-6 20:19 發表
雖然是bus error
如果沒有是因為位址沒有對齊的話 memcpy應該會自己處理的
我除錯了下 好象是lseek函式用的有問題
你可以先檢視一下你新建立的那個檔案的大小是多少
stat filename
你也就是lseek了乙個 ...
雖然是bus error
如果沒有是因為位址沒有對齊的話 memcpy應該會自己處理的
我除錯了下 好象是lseek函式用的有問題
你可以先檢視一下你新建立的那個檔案的大小是多少
stat filename
你也就是lseek了乙個空洞 但是並引起i/o操作
也就是說如果lseek之後沒有發生i/o操作時,lseek只是把偏移量給改了一下
並沒有在磁碟上分配儲存區
而你的檔案是新建的 儲存的空間長度為0 lseek之後還是為0
把mmap到系統的線性位址空間,然後進行複製的話就會出錯
所以建議lz在lseek之後進行乙個i/o操作,這樣就會把lseek跳過的長度給你分配磁碟儲存區的
這樣的話應該就沒有問題了
我在我機器上試過了
sigbus
signal ( )
匯流排錯誤 Bus error
在編制一和執行乙個程式的時候,人們可能會遇到下面的資訊 bus error core dumped 當出現這種資訊的時候,則表示在sparc等risc型別的cpu中發生了 違反定位訪問 的情況.例如,讀者可以閱讀下面的程式.include include void main 在這段程式中,能夠確保2...
匯流排錯誤與段錯誤
在計算機領域,匯流排錯誤 bus error 是一種硬體故障,為通知作業系統乙個程序正嘗試訪問cpu無法訪問的實體地址,即乙個無效的位址匯流排位址,它由此得名。在posix相容平台上,匯流排錯誤通常導致傳送sigbus訊號到導致錯誤的程序。sigbus也可能因計算機檢測到的任何常規裝置故障引發。匯流...
linux mmap驅動實現
在實現驅動程式的mmap函式時,要注意對映位址的轉換問題,見 定義乙個裝置結構體 這裡面這個memsize,最小都要是4096,因為記憶體對映是以頁為單位的。在實現 remap mmap函式時,如下 注意函式開頭的vma vm pgoff u32 virt to phys leedriverp me...