共享記憶體進程間通訊機制主要用於實現進程間大量的資料傳輸,下圖所示為進程間使用共享記憶體實現大量資料傳輸的示意圖:
#共享記憶體是記憶體中單獨開啟的一段記憶體空間,這段記憶體空間有自己獨特的資料結構,包括存取權、大小和最近存取的時間等。此資料結構定義如下:
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 */
#include <sys> #include <sys></sys></sys>
/*
* 第一個參數為 key 值,一般由 ftok() 函數產生
* 第二個參數為想要建立的共享記憶體段大小(單位為位元組)
* 第三個參數用來標識共享記憶體段的建立標識
*/
int shmget(key_t key, size_t size, int shmflg);
#include <sys> #include <sys></sys></sys>
/*
* 第一個參數為要操作的共享記憶體標識符
* 第二個參數為要執行的操作
* 第三個參數為 shmid_ds 結構的暫時共享記憶體變數資訊
*/
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
#系統呼叫 shmat() 函數實作將一個共享記憶體段映射到呼叫程序的資料段中,並傳回記憶體空間首位址,其函數宣告如下:
#include <sys> #include <sys> </sys></sys>
/*
* 第一個參數為要操作的共享記憶體標識符
* 第二個參數用來指定共享記憶體的映射位址,非0則為此參數,為0的話由系統分配
* 第三個參數用來指定共享記憶體段的存取權限和映射條件
*/
void *shmat(int shmid, const void *shmaddr, int shmflg);
#在使用完畢共享記憶體空間後,需要使用 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進程間如何共享記憶體的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。

Linux操作系統的核心是其命令行界面,通過命令行可以執行各種操作。 1.文件和目錄操作使用ls、cd、mkdir、rm等命令管理文件和目錄。 2.用戶和權限管理通過useradd、passwd、chmod等命令確保系統安全和資源分配。 3.進程管理使用ps、kill等命令監控和控制系統進程。 4.網絡操作包括ping、ifconfig、ssh等命令配置和管理網絡連接。 5.系統監控和維護通過top、df、du等命令了解系統運行狀態和資源使用情況。

介紹 Linux是一個強大的操作系統,由於其靈活性和效率,開發人員,系統管理員和電源用戶都喜歡。但是,經常使用長而復雜的命令可能是乏味的

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Dreamweaver Mac版
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。