91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux系統編程中共享內存的mmap函數是什么

發布時間:2021-09-27 15:41:10 來源:億速云 閱讀:245 作者:柒染 欄目:系統運維

Linux系統編程中共享內存的mmap函數是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

共享內存概念

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

Linux系統編程中共享內存的mmap函數是什么

共享內存被創建以后,同一塊物理內存被映射到了多個進程地址空間,當有一個進程修改了共享內存的數據,其余的進程均可看見所修改的內容,反之亦然。

Linux系統編程中共享內存的mmap函數是什么

mmap函數

函數原型:

void mmap(void adrr, size_t length, int prot, int flags, int fd, off_t offset);

返回值:

  • 成功:返回創建的映射區首地址;

  • 失敗:返回MAP_FAILED

具體參數含義:

  • addr:指向映射區的首地址,這是由系統內核所決定的,一般設為NULL;

  • length:欲創建的映射區大小;

  • prot:映射區的權限,一般有如下幾種:

  • PROT_EXEC 映射區域可被執行

  • PROT_READ 映射區域可被讀取

  • PROT_WRITE 映射區域可被寫入

  • PROT_NONE 映射區域不能存取

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

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

  • MAP_PRIVATE:對映射區所作的修改不會反映到物理設備。

  • fd:創建的映射區的文件描述符;

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

mumap函數

函數原型:

int munmap(void *addr, size_t length);

函數作用:

如同malloc之后需要free一樣,mmap調用創建的映射區使用完畢之后,需要調用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; }

看完上述內容,你們掌握Linux系統編程中共享內存的mmap函數是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海宁市| 河池市| 临海市| 睢宁县| 天门市| 鲁山县| 分宜县| 辽中县| 密山市| 台北县| 方山县| 正宁县| 潢川县| 孙吴县| 仁化县| 无棣县| 永登县| 修文县| 吕梁市| 叙永县| 临猗县| 都匀市| 永吉县| 台前县| 工布江达县| 应城市| 卢氏县| 桂阳县| 灵山县| 鹤壁市| 苍山县| 三门峡市| 浏阳市| 西昌市| 北碚区| 梓潼县| 桑日县| 沅江市| 宁武县| 仲巴县| 大连市|