欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Linux系統(tǒng)編程中共享內(nèi)存的mmap函數(shù)是什么

Linux系統(tǒng)編程中共享內(nèi)存的mmap函數(shù)是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

公司主營業(yè)務(wù):做網(wǎng)站、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出興山免費做網(wǎng)站回饋大家。

共享內(nèi)存概念

共享內(nèi)存是通信效率最高的IPC方式,因為進程可以直接讀寫內(nèi)存,而無需進行數(shù)據(jù)的拷備。但是它沒有自帶同步機制,需要配合信號量等方式來進行同步。

Linux系統(tǒng)編程中共享內(nèi)存的mmap函數(shù)是什么

共享內(nèi)存被創(chuàng)建以后,同一塊物理內(nèi)存被映射到了多個進程地址空間,當(dāng)有一個進程修改了共享內(nèi)存的數(shù)據(jù),其余的進程均可看見所修改的內(nèi)容,反之亦然。

Linux系統(tǒng)編程中共享內(nèi)存的mmap函數(shù)是什么

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)內(nèi)核所決定的,一般設(shè)為NULL;

  • length:欲創(chuàng)建的映射區(qū)大小;

  • prot:映射區(qū)的權(quán)限,一般有如下幾種:

  • PROT_EXEC 映射區(qū)域可被執(zhí)行

  • PROT_READ 映射區(qū)域可被讀取

  • PROT_WRITE 映射區(qū)域可被寫入

  • PROT_NONE 映射區(qū)域不能存取

  • flags:指映射區(qū)的標志位,MAP_FIXED與MAP_PRIVATE必須選擇一個:

  • MAP_FIXED:對映射區(qū)所作的修改會反映到物理設(shè)備,但需要調(diào)用msync()或者munmap();

  • MAP_PRIVATE:對映射區(qū)所作的修改不會反映到物理設(shè)備。

  • fd:創(chuàng)建的映射區(qū)的文件描述符;

  • offset:被映射文件的偏移量,一般設(shè)為0,表示從頭開始映射。

mumap函數(shù)

函數(shù)原型:

int munmap(void *addr, size_t length);

函數(shù)作用:

如同malloc之后需要free一樣,mmap調(diào)用創(chuàng)建的映射區(qū)使用完畢之后,需要調(diào)用munmap去釋放。

例程

寫進程:

 #include <stdio.h>  #include <sys/mman.h>  #include <sys/types.h>  #include <sys/stat.h>  #include <fcntl.h>  #include <unistd.h>  #include <string.h>    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 <stdio.h>  #include <sys/mman.h>  #include <sys/types.h>  #include <sys/stat.h>  #include <fcntl.h>  #include <unistd.h>    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; }

看完上述內(nèi)容,你們掌握Linux系統(tǒng)編程中共享內(nèi)存的mmap函數(shù)是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站欄目:Linux系統(tǒng)編程中共享內(nèi)存的mmap函數(shù)是什么
路徑分享:http://chinadenli.net/article32/pijcpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計公司、、手機網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營