并發編程--共享內存SHM

共享內存SHM

文章目錄

  • 共享內存SHM
    • 1. 基本概念
    • 2. 函數接口
      • 2.1 創建或打開SHM對象
      • 2.2 映射 / 解除映射SHM對象
      • 2.3 其余操作
      • 2.4示例代碼

1. 基本概念

共享內存,顧名思義,就是通過不同進程共享一段相同的內存來達到通信的目的,由于SHM對象不再交由內核托管,因此共享內存SHM對象是眾多IPC方式最高效的一種方式,但也因為這個原因,SHM一般不能單獨使用,而需要配合諸如互斥鎖、信號量等協同機制使用。

共享內存實現邏輯

2. 函數接口

使用共享內存的一般步驟是:

  1. 獲取共享內存對象的ID
  2. 將共享內存映射至本進程虛擬內存空間的某個區域
  3. 當不再使用時,解除映射關系
  4. 當沒有進程再需要這塊共享內存時,刪除它。

下面來詳細介紹這些函數接口的用法。

2.1 創建或打開SHM對象

與消息隊列類似,SHM對象的創建或打開也需要一個唯一的鍵值標識,并且需要指定內存的大小尺寸,具體接口如下:

#include <sys/ipc.h>
#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);

接口說明:

  • 返回值:SHM對象ID
  • 參數key:SHM對象鍵值
  • 參數size:共享內存大小
  • 參數shmflg:創建模式和權限
    • IPC_CREAT:如果key對應的共享內存不存在,則創建SHM對象
    • IPC_EXCL:如果該key對應的共享內存已存在,則報錯
    • 權限與文件創建open類似,用八進制表示

示例代碼:

int main(void)
{key_t key = ftok(".", 1);int shmid;// 創建或打開一個大小為1024自己的SHM對象,獲取其IDshmid = shmget(key, 1024, IPC_CREAT|0666);if(shmid < 0){perror("創建SHM對象失敗");}// ...return 0;
}	

2.2 映射 / 解除映射SHM對象

有了SHM對象的ID之后,必須先將其映射到用戶進程的內存空間之后方可使用,映射接口如下:

#include <sys/types.h>
#include <sys/shm.h>void *shmat(int shmid, const void *shmaddr/*一般為NULL*/, int shmflg);

接口說明:

  • 功能:
    • 將指定的共享內存,映射到本進程內存空間
  • 參數:
    • shmid:指定的共享內存的ID
    • shmaddr:指定映射后的地址,因為是虛擬地址,分配的原則要兼顧諸如段對齊、權限分配等問題,因此用戶進程是無法指定的,只能由系統自動分配,因此此參數一般為NULL,表示交由系統來自動分配。
    • shmflg:可選項
      • 0:默認,代表共享內存可讀可寫。
      • SHM_RDONLY:代表共享內存只讀。
  • 返回值:
    • 共享內存映射后的虛擬地址入口。

正確映射之后,命令ipcs -m查看SHM對象時,可從nattch列中看到已映射進程個數:

aidevelop@aidevelop-vm:~$ ipcs -m------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 688132     aidevelop  600        67108864   2          dest         
0x00000000 688137     aidevelop  600        524288     2          dest         
0x00000000 688138     aidevelop  600        524288     2          dest         
0x00000000 688139     aidevelop  600        4389528    2          dest         
0x00000000 688142     aidevelop  600        524288     2          dest         
0x5101374a 20         aidevelop  600        1024       1                    

使用完SHM對象后,需要將其跟進程解除關聯關系,即解除映射,函數接口如下:

#include <sys/types.h>
#include <sys/shm.h>int shmdt(const void *shmaddr);

該函數接口非常簡單,參數就是從 shmat() 返回的SHM對象的入口指針。

2.3 其余操作

與其他IPC對象一樣,共享內存也有一個control函數,可用于設置SHM對象屬性信息、獲取SHM屬性信息、刪除SHM對象等其余操作,接口如下:

#include <sys/ipc.h>
#include <sys/shm.h>int shmctl(int shmid, int cmd, struct shmid_ds *buf);

接口說明:

  • shmid:指定的共享內存的ID
  • cmd:一些命令字
    • IPC_STAT:獲取共享內存 的一些信息,放入shmid_ds{ }中
    • IPC_SET:將 buf 中指定的信息,設置到本共享內存中
    • IPC_RMID:刪除指定的共享內存,此時第三個參數 buf 將被忽略
  • buf:用來存放共享內存信息的結構體

用的較多的就是刪除SHM對象,示例代碼如下:

shmctl(shmid, IPC_RMID, NULL);

2.4示例代碼

int main(int argc,char *argv[])
{key_t key = ftok(".",1);int shmid = shmget(key, SHMSIZE, IPC_CREAT | 0666);char *addr1 = shmat(shmid,NULL,0);bzero(addr1,SHMSIZE);fgets(addr1, SHMSIZE,stdin);shmdt(addr1);return 0;
}
int main(int argc,char *argv[])
{key_t key = ftok(".",1);int shmid = shmget(key, SHMSIZE, IPC_CREAT | 0666);char *addr2 = shmat(shmid,NULL,0);printf("from Jack : %s",addr2);shmdt(addr2);return 0;
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75904.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis中的數據類型與適用場景

目錄 前言1. 字符串 (String)1.1 特點1.2 適用場景 2. 哈希 (Hash)2.1 特點2.2 適用場景 3. 列表 (List)3.1 特點3.2 適用場景 4. 集合 (Set)4.1 特點4.2 適用場景 5. 有序集合 (Sorted Set)5.1 特點5.2 適用場景 6. Redis 數據類型的選型建議結語 前言 Redis 作為一款高性能的…

科技賦能建筑業變革:中建海龍創新引領高質量發展新路徑

在建筑工業化浪潮中&#xff0c;中建海龍科技有限公司&#xff08;以下簡稱“中建海龍”&#xff09;憑借深厚的技術積累與持續創新&#xff0c;成為推動行業轉型升級的標桿企業。作為中國建筑國際集團旗下核心科技力量&#xff0c;中建海龍深耕模塊化集成建筑&#xff08;MiC&…

Vue下 Sortable 實現 table 列表字段可拖拽排序,顯示隱藏組件開發

vue 開發table 列表時&#xff0c;需要動態調整列字段的順序和顯示隱藏 實現效果如圖所示&#xff1a; vue 組件代碼 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…

故障扭曲棱鏡反射照片效果ps特效濾鏡樣機 Distorted Mirror Poster Effect

只需單擊幾下即可執行令人著迷的高質量圖像和攝影&#xff01;此照片效果包含智能對象圖層&#xff0c;提供完全自定義、易用性和多功能性的工作流程。只需雙擊其縮略圖打開所需的圖層&#xff0c;刪除占位符鏡頭&#xff0c;添加圖形&#xff0c;保存它&#xff0c;然后觀看 P…

基于dify平臺批量分析excel格式信息

如何以表格形式批量輸入一些信息&#xff0c;然后讓大模型以對話應用形式逐條進行推理分析&#xff1f; 這里提供一個分步解決方案&#xff0c;結合 Dify平臺功能 和 API調用優化 的思路&#xff0c;既保證效率又降低復雜度&#xff1a; 1. 優先檢查 Dify 的「數據集」功能 Di…

CARLA常見技術問題集錦(一)地圖與場景構建篇

編者薦語&#xff1a; 在自動駕駛技術加速落地的今天&#xff0c;CARLA 仿真引擎憑借其開源生態與高保真仿真能力&#xff0c;已成為全球開發者構建智能駕駛算法的核心工具之一。隨著虛幻引擎 5.5 的全面升級&#xff0c;CARLA 0.10.0 版本實現了視覺革命&#xff1a;Lumen 全…

vue+webpack5(高級配置)

項目地址 基礎配置可查看文檔 1、devtool 配置 (找到報錯位置)2、優化打包速度3、oneOf 每個文件只被一個loader處理4、 include/exclude 處理某些文件或者排除某些文件5、 cache 緩存 &#xff08;提升后面幾次的打包速度&#xff09;6、 多進程打包7、減少代碼體積 Tree Shak…

JavaWeb——事務管理、AOP

目錄 一、事管理 1.開啟事務管理日志 2.開啟事務管理 3.傳播行為 二、AOP 1.通知類型 2.通知順序 3.切入點表達式 4.連接點 一、事務管理 1.開啟事務管理日志 2.開啟事務管理 3.傳播行為 當一個事務方法被另一個事務方法調用時&#xff0c;這個事物方法應該如何進行事…

okhttp3網絡請求

一、使用okhttp3和gson build.gradle ... dependencied {...implementation com.squareup.okhttp3:okhttp:3.9.0implementation com.google.code.gson:gson:2.10.1 }二、響應模型 可根據實際情況進行調整&#xff0c;目前我所需的就是這三個變量 HttpResponseData.java im…

【藍橋杯每日一題】3.28

&#x1f3dd;?專欄&#xff1a; 【藍橋杯備篇】 &#x1f305;主頁&#xff1a; f狐o貍x "今天熬的夜&#xff0c;會變成明天獎狀的閃光點&#xff01;" 目錄 一、唯一的雪花 題目鏈接 題目描述 解題思路 解題代碼 二、逛畫展 題目鏈接 題目描述 解題思路 解題代…

【MinIO】Bucket的生命周期管理

&#x1f47b;創作者&#xff1a;丶重明 &#x1f47b;創作時間&#xff1a;2025年3月7日 &#x1f47b;擅長領域&#xff1a;運維 目錄 1.ILM使用介紹2.生命周期配置實例 1.ILM使用介紹 對象生命周期管理&#xff08;ILM&#xff09;是現代對象存儲系統的核心功能之一&#x…

Android 中隱藏標題欄和狀態欄的方法

在Android開發中&#xff0c;隱藏標題欄和狀態欄是實現全屏顯示的常見需求。 一、隱藏標題欄 1、通過代碼隱藏 對于繼承自 AppCompatActivity 的 Activty&#xff0c;可在 onCreate() 方法中調用supportRequestWindowFeature 或 getSupportActionBar 方法來隱藏標題欄。 ove…

進程間通信——信號量

進程間通信——信號量 目錄 一、基本概念 1.1 概念 1.2 基本操作 1.3 相關函數 1.3.1 semget創建/獲取 1.3.2 semop操作信號量 1.3.3 semctl初始化/刪除 二、代碼操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…

Linux內核2-TFTP與NFS環境搭建

Uboot&#xff1a;引導程序 初始化硬件設備&#xff0c;初始化c語言環境&#xff0c;為內核加載做準備 zImage:內核文件 rootfs:文件系統&#xff0c;為用戶提供一個與硬件設備數據交互的系統 1.TFTP和NFS功能 TFTP:簡單文件傳輸協議網絡配置 pc可以下載 2.minicom bootargs…

TDengine 中的命名與邊界

簡介 本章主要介紹命名的合法字符集和限制規則&#xff0c;這對于正確使用 TDengine&#xff0c;減小報錯很重要&#xff0c;這些規則在 SQL 語句中都生效&#xff0c;在使用過程中要注意&#xff0c;避免不必要的錯誤。 名稱命名規則 合法字符&#xff1a;英文字符、數字和…

C++ 中將函數作為參數傳遞

C 中將函數作為參數傳遞 1. 通過指針傳遞函數 函數可以通過傳遞函數的地址來作為參數傳遞&#xff1b;簡而言之&#xff0c;就是通過指針實現這一點。 示例代碼 #include <iostream> using namespace std;// 定義加法和減法函數 #include <iostream> #include …

Vala 編程語言教程-繼承

繼承? 在 Vala 中&#xff0c;一個類可以繼承自 ?一個或零個? 其他類。盡管實際開發中通常繼承一個類&#xff08;不同于 Java 等語言的隱式繼承機制&#xff09;&#xff0c;但 Vala 并不強制要求必須繼承。 當定義繼承自其他類的子類時&#xff0c;子類的實例與父…

Crypto Architecture Kit簡介

HarmonyOS 5.0.3(15) 版本的配套文檔&#xff0c;該版本API能力級別為API 15 Release 文章目錄 約束與限制能力范圍基本概念與相關Kit的關系 Crypto Architecture Kit屏蔽了第三方密碼學算法庫實現差異的算法框架&#xff0c;提供加解密、簽名驗簽、消息驗證碼、哈希、安全隨機…

交流電機類型及其控制技術

交流電機可分為同步電機和異步電機兩大種類&#xff0c;如果電機轉子的轉速與定子旋轉磁場的轉速相等&#xff0c;轉子與定子旋轉磁場在空間同步地旋轉&#xff0c;這種電機就稱為同步電機。如果電機轉子的轉速不等于定子旋轉磁場的轉速&#xff0c;轉子與定子旋轉磁場在空間旋…

SQL語言分類及命令詳解(一)

目錄 1. DQL&#xff08;Data Query Language&#xff09;數據查詢語言 主要命令&#xff1a; SELECT 2. DDL&#xff08;Data Definition Language&#xff09;數據定義語言 主要命令&#xff1a; CREATE ALTER DROP TRUNCATE&#xff08;清空表數據&#xff0c;保留…