搜尋
首頁系統教程LinuxLinux進程間如何共享記憶體

Linux進程間如何共享記憶體

Jun 02, 2024 am 09:18 AM
linuxlinux教程紅帽linux系統linux指令linux認證紅帽linuxlinux視頻

共享記憶體 IPC 原理

共享記憶體進程間通訊機制主要用於實現進程間大量的資料傳輸,下圖所示為進程間使用共享記憶體實現大量資料傳輸的示意圖:

Linux進程間如何共享記憶體

#共享記憶體是記憶體中單獨開啟的一段記憶體空間,這段記憶體空間有自己獨特的資料結構,包括存取權、大小和最近存取的時間等。此資料結構定義如下:

from /usr/include/linux/shm.h

struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms 操作权限 */
int shm_segsz; /* size of segment (bytes) 段长度大小 */
__kernel_time_t shm_atime; /* last attach time 最近attach时间 */
__kernel_time_t shm_dtime; /* last detach time 最近detach时间 */
__kernel_time_t shm_ctime; /* last change time 最近change时间 */
__kernel_ipc_pid_t shm_cpid; /* pid of creator 创建者pid */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator 最近操作pid */
unsigned short shm_nattch; /* no. of current attaches */
unsigned short shm_unused; /* compatibility */
void *shm_unused2; /* ditto - used by DIPC */
void *shm_unused3; /* unused */
};

兩個進程在使用此共享記憶體空間之前,需要在進程位址空間與共享記憶體空間之間建立聯繫,即將共享記憶體空間掛載到進程中。

系統對共享記憶體做了以下限制:

#define SHMMAX 0x2000000 /* max shared seg size (bytes) 最大共享段大小 */
#define SHMMIN 1 /* min shared seg size (bytes) 最小共享段大小 */
#define SHMMNI 4096 /* max num of segs system wide */
#define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16))
#define SHMSEG SHMMNI /* max shared segs per process */
Linux 共享記憶體管理
1.建立共享記憶體
#
#include <sys> #include <sys></sys></sys>

/*
* 第一個參數為 key 值,一般由 ftok() 函數產生
* 第二個參數為想要建立的共享記憶體段大小(單位為位元組)
* 第三個參數用來標識共享記憶體段的建立標識
*/

int shmget(key_t key, size_t size, int shmflg);
2.共享記憶體控制
#
#include <sys> #include <sys></sys></sys>

/*
* 第一個參數為要操作的共享記憶體標識符
* 第二個參數為要執行的操作
* 第三個參數為 shmid_ds 結構的暫時共享記憶體變數資訊
*/

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
3.映射共享記憶體物件

#系統呼叫 shmat() 函數實作將一個共享記憶體段映射到呼叫程序的資料段中,並傳回記憶體空間首位址,其函數宣告如下:

#include <sys>
#include <sys>
</sys></sys>

/*
* 第一個參數為要操作的共享記憶體標識符
* 第二個參數用來指定共享記憶體的映射位址,非0則為此參數,為0的話由系統分配
* 第三個參數用來指定共享記憶體段的存取權限和映射條件
*/

void *shmat(int shmid, const void *shmaddr, int shmflg);
4.分離共享記憶體物件

#在使用完畢共享記憶體空間後,需要使用 shmdt() 函數呼叫將其與目前進程分開。函數宣告如下:

#include <sys>
#include <sys>
</sys></sys>

/*
* 參數為分配的共享記憶體首位址
*/

int shmdt(const void *shmaddr);
共享內存在父子進程間遵循的約定

#1.使用 fork() 函數建立子程序後,該程序繼承父親程序掛載的共享記憶體。

2.如果呼叫 exec() 執行一個新的程序,則所有掛載的共享記憶體將被自動卸載。

3.如果在某個進程中呼叫了 exit() 函數,所有掛載的共享記憶體將與目前進程脫離關係。

程式實例

申請一段共享內存,父進程在首地址存入一整數,子進程讀出。

#include
#include <sys>
#include <sys>
#include <sys>
#include
#include

#define SHM_SIZE 1024

int main()
{
int shm_id, pid;
int *ptr = NULL;
</sys></sys></sys>

/* 申請共享記憶體 */

shm_id = shmget((key_t)1004, SHM_SIZE, IPC_CREAT | 0600);

/* 映射共享記憶體到進程位址空間 */

ptr = (int*)shmat(shm_id, 0, 0);

printf("Attach addr is %p \n", ptr);

*ptr = 1004;

printf("The Value of Parent is : %d \n", *ptr);

if((pid=fork()) == -1){
perror("fork Err");
exit(0);
}
else if(!pid){
printf("The Value of Child is : %d \n", *ptr);
exit(0);
}else{
sleep(1);

/* 解除對映 */

shmdt(ptr);

/* 刪除共享記憶體 */

shmctl(shm_id, IPC_RMID, 0);
}

return 0;
}

輸出結果:

Linux進程間如何共享記憶體

#

以上是Linux進程間如何共享記憶體的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何管理FireWalld和UFW以進行Linux安全如何管理FireWalld和UFW以進行Linux安全May 12, 2025 am 10:56 AM

Linux系統依靠防火牆來保護未經授權的網絡訪問。 這些軟件障礙控製網絡流量,允許基於預定義的規則來阻止數據包。 他們主要在網絡層操作,他們管理

如何檢查Linux系統是台式機還是筆記本電腦如何檢查Linux系統是台式機還是筆記本電腦May 12, 2025 am 10:48 AM

確定Linux系統是台式機還是筆記本電腦對於系統優化至關重要。本指南概述了簡單的命令以識別您的系統類型。 hostnamectl命令:此命令提供了一種檢查系統機箱的簡潔方法

如何增加Linux中的TCP/IP連接如何增加Linux中的TCP/IP連接May 12, 2025 am 10:23 AM

Linux服務器TCP/IP連接數限制調整指南 Linux系統常用於服務器和網絡應用,管理員經常會遇到TCP/IP連接數達到上限的問題,導致用戶連接錯誤。本文將指導您如何提升Linux系統中的最大TCP/IP連接數。 TCP/IP連接數理解 TCP/IP (傳輸控制協議/互聯網協議)是互聯網的基本通信協議。每個TCP連接都需要係統資源。當活動連接過多時,系統可能會拒絕新的連接或速度變慢。 通過增加允許的最大連接數,可以提高服務器性能並處理更多並髮用戶。 檢查當前Linux連接數限制 在更改設置之

如何將SVG轉換為Linux終端中的PNG如何將SVG轉換為Linux終端中的PNGMay 12, 2025 am 10:21 AM

SVG(可擴展的矢量圖形)文件是徽標和插圖的理想選擇,因為它們的可重複性而沒有質量損失。 但是,PNG(便攜式網絡圖形)格式通常可以更好地與網站和應用程序兼容。本指南d

如何使用LiveCode創建自己的Android和iOS應用程序如何使用LiveCode創建自己的Android和iOS應用程序May 12, 2025 am 10:10 AM

Livecode:跨平台發展革命 LiveCode是一種編程語言,於1993年首次亮相,簡化了每個人的應用程序開發。 它的高級,類似英語的語法和動態鍵入使得可以輕鬆地創建強大的應用程序

如何從Linux終端重置USB設備如何從Linux終端重置USB設備May 12, 2025 am 10:07 AM

本指南提供了一個分步過程,用於通過Linux命令行重置故障USB設備。 使用這些命令簡化了對無響應或斷開USB驅動器的故障排除。 步驟1:識別您的USB設備 首先,我

如何在Linux上設置臨時靜態IP地址如何在Linux上設置臨時靜態IP地址May 12, 2025 am 10:06 AM

在Linux上暫時設置靜態IP地址對於網絡故障排除或特定的會話配置是無價的。 本指南詳細介紹瞭如何使用命令行工具來實現此目的,並指出更改並非跨重啟

51個鮮為人知的Linux命令用於電源用戶51個鮮為人知的Linux命令用於電源用戶May 12, 2025 am 09:51 AM

Linux以其強大的命令行工具集而聞名,這些工具允許用戶高效地與系統交互。雖然許多Linux用戶熟悉諸如ls、cd或grep之類的常用命令,但還有一些鮮為人知但極其有用的命令和快捷方式可以簡化並提高生產力。 我們很高興分享我們關於“鮮為人知的Linux命令”的最新五篇文章,其中包含50多個你可能不知道的命令。 您可能也喜歡: 11個鮮為人知的實用Linux命令——第一部分 10個鮮為人知的Linux命令——第二部分 10個鮮為人知的Linux命令——第三部分 10個鮮為人知的有效Linux命令

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具