mmap學習過程中的一些小問題

2021-06-18 00:24:41 字數 2313 閱讀 8352

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。

具體函式定義如下:

#include

/*對映函式*/

void *mmap(void *start,

size_t length, int prot, int flags,int fd, off_t offset);

/*解除對映函式*/

int munmap(void *start,

size_t length);

網上找尋了多個例子執行,經常會發生段錯誤或是匯流排錯誤,通過gdb除錯發現大多是由於分配的指標位址問題,例如無位址等,特此記錄。

小例子:

*********************process a******************************

#include

#include /* for mmap and munmap */

#include /* for open */

#include /* for open */

#include /* for open */

#include /* for lseek and write */

int main()

/*truncate函式

表頭檔案:#include

定義函式:int truncate(const char *path, off_t length);

函式說明:truncate()會將引數path指定的檔案大小改為引數length指定的大小。

如果原來的檔案大小比引數length大,則超過的部分會被刪除

open函式建立的檔案預設是大小為0的,無法進行對映,可以利用此函式寫定其大小,也有採取lseek/write的方法

*/ret=truncate("/tmp/sharefile",4096);

prt=(char*) mmap(null,strlen(msg)+1,prot_read|prot_write,map_shared,fd,0);

if(*prt == -1)

close(fd);

/*此時的memcpy就相當於利用write在寫檔案一樣*/

memcpy(prt,msg,strlen(msg)+1);

printf("%s",prt);

sleep(10);

printf("%s",prt);

/*用完記得解除對映,資源利用完最好都**做個環保的好孩子*/

munmap(prt,strlen(msg)+1);

return 0; }

***************************process b***********************************

#include /* for mmap and munmap */

#include /* for open */

#include /* for open */

#include /* for open */

#include /* for lseek and write */

#include

int main()

/*查詢檔案狀態如果檔案存在可用就用不著建立了,這裡定義mmap_file時候如果像文中是指標的一定要先分配位址,不然會有匯流排錯誤,或是直接別指標了,struct stat mmap_file就行,然後傳進stat()時給位址&mmap_file,當然後面的if裡內容也要變成mmap_file.st_size*/

struct stat *mmap_file;

mmap_file=(struct stat*)malloc(sizeof(struct stat));

ret=stat("/tmp/sharefile",mmap_file);

if(ret==-1)

if(mmap_file->st_size==0)    

prt=(char*) mmap(null,strlen(msg)+1,prot_read|prot_write,map_shared,fd,0);

close(fd);

memcpy(prt,msg,strlen(msg)+1);

munmap(prt,strlen(msg));

return 0; }

~~~~~~~~~~~~~~~~~~我哥哥哥

哥哥哥哥哥哥哥哥哥~~~~~~~~~~~~~~~~~~~~~

gcc兩個檔案後開兩個終端執行,先跑a,出現i am process a,會睡10s,在此之際跑b,10s後,出現i am process b。

專案 過程中的一些小問題,之前筆記

nginx swagger埠被封 location basicinfo web tomcat編碼 註解 autowired 它可以對類成員變數 方法及建構函式進行標註,完成自動裝配的工作。通過 autowired的使用來消除set,get方法。通過 autowired註解對bean的屬性變數.屬性s...

mvc開發過程中遇到的一些小問題修改

刪除按鈕通常新增乙個提示框判斷 onclick returen confirm 確定要刪除?顯示字段標題的地方,正常要用 html.labelfor 的方式,字段標題名稱在model 中用display來標識 modelstate.isvalid 針對模型引數的判斷驗證 c 語法中兩個問號 的運算子...

一些小問題

1 曼徹斯特編碼和差分曼徹斯特編碼。曼徹斯特編碼,常用於區域網傳輸。在曼徹斯特編碼中,每一位的中間有一跳變,位中間的跳變既作時鐘訊號,又作資料訊號 從高到低跳變表示 1 從低到高跳變表示 0 還有一種是差分曼徹斯特編碼,每位中間的跳變僅提供時鐘定時,而用每位開始時有無跳變表示 0 或 1 有跳變為 ...