Linux系統(tǒng)編程中共享內存的mmap函數(shù)是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
公司主營業(yè)務:做網站、網站建設、移動網站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出興山免費做網站回饋大家。
共享內存概念
共享內存是通信效率最高的IPC方式,因為進程可以直接讀寫內存,而無需進行數(shù)據(jù)的拷備。但是它沒有自帶同步機制,需要配合信號量等方式來進行同步。
共享內存被創(chuàng)建以后,同一塊物理內存被映射到了多個進程地址空間,當有一個進程修改了共享內存的數(shù)據(jù),其余的進程均可看見所修改的內容,反之亦然。
mmap函數(shù)
函數(shù)原型:
void mmap(void adrr, size_t length, int prot, int flags, int fd, off_t offset);
返回值:
成功:返回創(chuàng)建的映射區(qū)首地址;
失?。悍祷豈AP_FAILED
具體參數(shù)含義:
addr:指向映射區(qū)的首地址,這是由系統(tǒng)內核所決定的,一般設為NULL;
length:欲創(chuàng)建的映射區(qū)大小;
prot:映射區(qū)的權限,一般有如下幾種:
PROT_EXEC 映射區(qū)域可被執(zhí)行
PROT_READ 映射區(qū)域可被讀取
PROT_WRITE 映射區(qū)域可被寫入
PROT_NONE 映射區(qū)域不能存取
flags:指映射區(qū)的標志位,MAP_FIXED與MAP_PRIVATE必須選擇一個:
MAP_FIXED:對映射區(qū)所作的修改會反映到物理設備,但需要調用msync()或者munmap();
MAP_PRIVATE:對映射區(qū)所作的修改不會反映到物理設備。
fd:創(chuàng)建的映射區(qū)的文件描述符;
offset:被映射文件的偏移量,一般設為0,表示從頭開始映射。
mumap函數(shù)
函數(shù)原型:
int munmap(void *addr, size_t length);
函數(shù)作用:
如同malloc之后需要free一樣,mmap調用創(chuàng)建的映射區(qū)使用完畢之后,需要調用munmap去釋放。
例程
寫進程:
#include#include #include #include #include #include #include typedef struct {11 int id; char name[20]; char gender; }stu; int main(int argc, char *argv[]) { stu *p = NULL; int fd = 0; stu student = {10, "harry", 'm'}; if (argc < 2) { printf("useage: ./a.out file\n"); return -1; } fd = open(argv[1], O_RDWR | O_CREAT, 0664); if (fd == -1) { printf("ERROR: open failed!\n"); return -1; } ftruncate(fd, sizeof(stu)); p = mmap(NULL, sizeof(stu), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { printf("ERROR: mmap failed!\n"); return -1; } close(fd); while (1) { memcpy(p, &student, sizeof(stu)); student.id++; sleep(2); } munmap(p, sizeof(stu)); return 0; }
讀進程:
#include#include #include #include #include #include typedef struct { int id; char name[20]; char gender; }stu; int main(int argc, char *argv[]) { stu *p = NULL; int fd = 0; if (argc < 2) { printf("useage: ./a.out file\n"); return -1; } fd = open(argv[1], O_RDONLY); if (fd == -1) { printf("ERROR: open failed!\n"); return -1; } p = mmap(NULL, sizeof(stu), PROT_READ, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { printf("ERROR: mmap failed!\n"); return -1; } close(fd); while (1) { printf("id = %d, name = %s, gender = %c\n", p->id, p->name, p->gender); sleep(2); } munmap(p, sizeof(stu)); return 0; }
看完上述內容,你們掌握Linux系統(tǒng)編程中共享內存的mmap函數(shù)是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!