Linux系統編程之共享內存

概述

????????在Linux系統中,共享內存也是一種高效的進程間通信機制,允許兩個或多個進程共享同一塊物理內存區域。通過這種方式,不同進程可以直接訪問和操作相同的數據,從而避免了數據的復制。由于數據直接在內存中共享,沒有額外的數據傳輸過程,因此速度非常快。雖然共享內存本身提供了快速的數據交換方式,但它并不提供同步機制。這意味著,需要我們自己實現同步措施以防止競態條件。

API接口

????????在Linux中,主要通過以下幾個API接口來實現共享內存機制。

????????1、shmget:用于創建一個新的共享內存段,或獲取一個已存在的共享內存段。其函數原型如下。

int shmget(key_t key, size_t size, int shmflg);

????????各個參數和返回值的含義如下。

????????key:標識共享內存段的鍵值,通常使用ftok函數生成。

????????size:共享內存段的大小,以字節為單位。

????????shmflg:權限標志和創建標志(比如IPC_CREAT、IPC_EXCL等),以及訪問權限。

????????返回值:成功時,返回共享內存標識符。失敗時返回-1,可通過errno獲取具體的錯誤代碼。

????????2、shmat:將共享內存段連接到調用進程的地址空間。其函數原型如下。

void *shmat(int shmid, const void *shmaddr, int shmflg);

????????各個參數和返回值的含義如下。

????????shmid:由shmget函數返回的共享內存標識符。

????????shmaddr:指定共享內存段應連接到的地址,通常設置為NULL,讓系統自動選擇。

????????shmflg:控制共享內存段連接的方式,如SHM_RDONLY表示只讀。

????????返回值:成功時,返回指向共享內存段的指針。失敗時返回(void *) -1,可通過errno獲取具體的錯誤代碼。

????????3、shmdt:將共享內存段從調用進程的地址空間分離。其函數原型如下。

int shmdt(const void *shmaddr);

????????各個參數和返回值的含義如下。

????????shmaddr:由shmat返回的地址。

????????返回值:成功時,返回0。失敗時返回-1,可通過errno獲取具體的錯誤代碼。

????????4、shmctl:執行多種控制操作,如獲取共享內存段的狀態、設置共享內存段的狀態、刪除共享內存段等。其函數原型如下。

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

????????各個參數和返回值的含義如下。

????????shmid:由shmget函數返回的共享內存標識符。

????????cmd:命令ID,比如,IPC_STAT表示獲取狀態、IPC_SET表示設置狀態、IPC_RMID表示移除段。

????????buf:根據命令不同,可能需要提供一個指向struct shmid_ds結構體的指針。

????????返回值:成功時,返回0。失敗時返回-1,可通過errno獲取具體的錯誤代碼。

實戰代碼

????????在下面的實戰代碼中,我們使用共享內存機制來創建、寫入和分離一個共享內存段。

????????首先,通過調用ftok函數并傳入一個路徑名和一個項目ID,生成一個唯一的鍵值,該鍵值用于后續標識共享內存段。然后,利用shmget函數根據這個鍵值創建一個新的共享內存段。這里指定共享內存的大小為1024字節,并設置了權限標志,以確保創建時賦予讀寫權限給所有用戶。

????????一旦成功獲得共享內存段的標識符shmid,我們便通過shmat函數將這個共享內存段連接到當前進程的地址空間中。shmat會返回一個指向共享內存起始位置的指針,隨后,我們使用strcpy函數將字符串復制到該指針中。

????????最后,我們調用shmdt函數將共享內存段從當前進程的地址空間中進行了分離。

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>int main()
{// 創建唯一的鍵key_t key = ftok("shmfile", 66);// 創建共享內存段int shmid = shmget(key, 1024, 0666|IPC_CREAT);// 連接共享內存段char *pszBuffer = (char*)shmat(shmid, (void*)0, 0);strcpy(pszBuffer, "Hello, Hope_Wisdom");printf("Data written in memory: %s\n", pszBuffer);// 分離共享內存段shmdt(pszBuffer);return 0;
}

????????為了與上面的進程相配合,我們實現了下面的進程,使用共享內存機制來獲取、讀取和管理一個共享內存段。

????????首先,我們調用shmget函數根據鍵值獲取一個已經存在的共享內存段。這里指定共享內存的大小為1024字節,并設置了權限標志,以確保創建時賦予讀寫權限給所有用戶。

????????一旦成功獲得共享內存段的標識符shmid,我們便通過shmat函數將這個共享內存段連接到當前進程的地址空間中。shmat會返回一個指向共享內存起始位置的指針,隨后,我們直接嘗試從該指針讀取數據并打印出來。

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>int main()
{// 創建唯一的鍵key_t key = ftok("shmfile", 66);// 獲取共享內存段IDint shmid = shmget(key, 1024, 0666|IPC_CREAT);// 連接共享內存段char *pszBuffer = (char*)shmat(shmid, (void*)0, 0);printf("Data read from memory: %s\n", pszBuffer);// 分離共享內存段shmdt(pszBuffer);// 刪除共享內存段shmctl(shmid, IPC_RMID, NULL);return 0;
}

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

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

相關文章

零知開源——STM32F407VET6驅動Flappy Bird游戲教程

簡介 本教程使用STM32F407VET6零知增強板驅動3.5寸TFT觸摸屏實現經典Flappy Bird游戲。通過觸摸屏控制小鳥跳躍&#xff0c;躲避障礙物柱體&#xff0c;挑戰最高分。項目涉及STM32底層驅動、圖形庫移植、觸摸控制和游戲邏輯設計。 目錄 簡介 一、硬件準備 二、軟件架構 三、…

Elasticsearch創建快照倉庫報錯處理

創建快照倉庫報錯&#xff1a; 根據報錯提示的信息&#xff0c;問題可能出在 Elasticsearch 的配置中。當你嘗試創建一個文件系統&#xff08;fs&#xff09;類型的快照倉庫時&#xff0c;雖然已經指定了 location 參數&#xff0c;但 Elasticsearch 仍然報錯&#xff0c;這通…

服務器如何配置防火墻管理端口訪問?

配置服務器防火墻來管理端口訪問&#xff0c;是保障云服務器安全的核心步驟。下面我將根據你使用的不同操作系統&#xff08;Linux: Ubuntu/Debian/CentOS&#xff1b;Windows Server&#xff09;介紹常用防火墻配置方法。 ? 一、Linux 防火墻配置&#xff08;UFW / firewalld…

Redis最佳實踐——安全與穩定性保障之連接池管理詳解

Redis 在電商應用的連接池管理全面詳解 一、連接池核心原理與架構 1. 連接池工作模型 #mermaid-svg-G7I3ukCljlJZAXaA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G7I3ukCljlJZAXaA .error-icon{fill:#552222;}…

打印機無法遠程打印?可以本地打印,本地網絡打印機設置給異地使用

很多小伙伴常有打印、遠程打印的需求&#xff0c;特別是對于電商人、跨境電商、教師、產品經理、實驗人員等群體來說掌握這項技能可謂是能夠在很多場景下帶來便捷&#xff0c;大幅提升做事效率&#xff01;打印機是家庭和企業經常用到的設備&#xff0c;很多情況下會遇到本地可…

【Linux】進程地址空間揭秘(初步認識)

10.進程地址空間&#xff08;初步認識&#xff09; 文章目錄 10.進程地址空間&#xff08;初步認識&#xff09;一、進程地址空間的實驗現象解析二、進程地址空間三、虛擬內存管理補充&#xff1a;數據的寫時拷貝&#xff08;淺談&#xff09;補充&#xff1a;頁表&#xff08;…

深入探討redis:主從復制

前言 如果某個服務器程序&#xff0c;只部署在一個物理服務器上就可能會面臨一下問題(單點問題) 可用性問題&#xff0c;如果這個機器掛了&#xff0c;那么對應的客戶端服務也相繼斷開性能/支持的并發量有限 所以為了解決這些問題&#xff0c;就要引入分布式系統&#xff0c…

MacOS安裝Docker Desktop并漢化

1. 安裝Docker Desktop 到Docker Desktop For Mac下載對應系統的Docker Desktop 安裝包&#xff0c;下載后安裝&#xff0c;沒有賬號需要注冊&#xff0c;然后登陸即可。 2. 漢化 前往漢化包下載鏈接下載對應系統的.asar文件 然后將安裝好的文件覆蓋原先的文件app.asar文件…

索引的選擇與Change Buffer

1. 索引選擇與Change Buffer 問題引出&#xff1a;普通索引 vs 唯一索引 ——如何選擇&#xff1f; 在實際業務中&#xff0c;如果一個字段的值天然具有唯一性&#xff08;如身份證號&#xff09;&#xff0c;并且業務代碼已確保無重復寫入&#xff0c;那就存在兩種選擇&…

lua注意事項

感覺是lua的一大坑啊&#xff0c;它還不如函數內部就局部變量呢 注意函數等內部&#xff0c;全部給加上local得了

【多線程初階】死鎖的產生 如何避免死鎖

文章目錄 關于死鎖一.死鎖的三種情況1.一個線程,一把鎖,連續多次加鎖2.兩個線程,兩把鎖3.N個線程,M把鎖 --哲學家就餐問題 二.如何避免死鎖死鎖是如何構成的(四個必要條件)打破死鎖 三.死鎖小結 關于死鎖 一.死鎖的三種情況 1.一個線程,一把鎖,連續多次加鎖 -->由synchroni…

【NLP基礎知識系列課程-Tokenizer的前世今生第二課】NLP 中的 Tokenizer 技術發展史

從詞表到子詞&#xff1a;Tokenizer 的“進化樹” 我們常說“語言模型是理解人類語言的工具”&#xff0c;但事實上&#xff0c;模型能不能“理解”&#xff0c;關鍵要看它接收到了什么樣的輸入。而 Tokenizer&#xff0c;就是這一輸入階段的設計者。 在 NLP 的發展歷程中&am…

Rust 學習筆記:循環和迭代器的性能比較

Rust 學習筆記&#xff1a;循環和迭代器的性能比較 Rust 學習筆記&#xff1a;循環和迭代器的性能比較示例 1示例 2總結 Rust 學習筆記&#xff1a;循環和迭代器的性能比較 示例 1 我們運行一個基準測試&#xff0c;將《福爾摩斯探案集》的全部內容加載到一個字符串中&#x…

pod創建和控制

一、引言 ?主題?&#xff1a;pod以及控制器模式中的Deployment作用。?控制器模式&#xff1a;使用一種API對象&#xff08;如Deployment&#xff09;管理另一種API對象&#xff08;如Pod&#xff09;的方式。 二、容器鏡像與配置文件 ?容器鏡像?&#xff1a;應用開發者…

HTML實戰:愛心圖的實現

設計思路 使用純CSS創建多種風格的愛心 添加平滑的動畫效果 實現交互式愛心生成器 響應式設計適應不同設備 優雅的UI布局和色彩方案 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta nam…

2022年 中國商務年鑒(excel電子表格版)

2022年 中國商務年鑒&#xff08;excel電子表格版&#xff09;.ziphttps://download.csdn.net/download/2401_84585615/89772883 https://download.csdn.net/download/2401_84585615/89772883 《中國商務年鑒2022》是由商務部國際貿易經濟合作研究院主辦的年度統計資料&#xf…

Redis核心數據結構操作指南:字符串、哈希、列表詳解

注&#xff1a;此為蒼穹外賣學習筆記 Redis作為高性能的鍵值數據庫&#xff0c;其核心價值來自于豐富的數據結構支持。本文將深入解析字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、**列表&#xff08;List&#xff09;**三大基礎結構的操作命令&…

如何以 9 種方式將照片從 iPhone 傳輸到筆記本電腦

您的 iPhone 可能充滿了以照片和視頻形式捕捉的珍貴回憶。無論您是想備份它們、在更大的屏幕上編輯它們&#xff0c;還是只是釋放設備上的空間&#xff0c;您都需要將照片從 iPhone 傳輸到筆記本電腦。幸運的是&#xff0c;有 9 種方便的方法可供使用&#xff0c;同時滿足 Wind…

如何使用Python從MySQL數據庫導出表結構到Word文檔

在開發和維護數據庫的過程中&#xff0c;能夠快速且準確地獲取表結構信息是至關重要的。本文將向您展示一種簡單而有效的方法&#xff0c;利用Python腳本從MySQL數據庫中提取指定表的結構信息&#xff0c;并將其導出為格式化的Word文檔。此方法不僅提高了工作效率&#xff0c;還…

寫作-- 復合句練習

文章目錄 練習 11. 家庭的支持和老師的指導對學生的學術成功有積極影響。2. 缺乏準備和未能適應通常會導致在挑戰性情境中的糟糕表現。3. 吃垃圾食品和忽視鍛煉可能導致嚴重的健康問題,因此人們應注重保持均衡的生活方式。4. 昨天的大雨導致街道洪水泛濫,因此居民們遷往高地以…