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

溫馨提示×

溫馨提示×

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

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

Linux如何實現進程間共享內存

發布時間:2022-02-18 10:31:47 來源:億速云 閱讀:236 作者:iii 欄目:開發技術

這篇文章主要介紹“Linux如何實現進程間共享內存”,在日常操作中,相信很多人在Linux如何實現進程間共享內存問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux如何實現進程間共享內存”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

共享內存就是允許兩個或多個進程共享一定的存儲區。就如同 malloc() 函數向不同進程返回了指向同一個物理內存區域的指針。當一個進程改變了這塊地址中的內容的時候,其它進程都會察覺到這個更改。因為數據不需要在客戶機和服務器端之間復制,數據直接寫到內存,不用若干次數據拷貝,所以這是最快的一種IPC。

共享內存 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  #include

/* * 第一個參數為 key 值,一般由 ftok() 函數產生 * 第二個參數為欲創建的共享內存段大小(單位為字節) * 第三個參數用來標識共享內存段的創建標識 */

int shmget(key_t key, size_t size, int shmflg);
2.共享內存控制
#include  #include

/* * 第一個參數為要操作的共享內存標識符 * 第二個參數為要執行的操作 * 第三個參數為 shmid_ds 結構的臨時共享內存變量信息 */

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
3.映射共享內存對象

系統調用 shmat() 函數實現將一個共享內存段映射到調用進程的數據段中,并返回內存空間首地址,其函數聲明如下:

#include #include

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

void *shmat(int shmid, const void *shmaddr, int shmflg);
4.分離共享內存對象

在使用完畢共享內存空間后,需要使用 shmdt() 函數調用將其與當前進程分離。函數聲明如下:

#include #include

/* * 參數為分配的共享內存首地址 */

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

1.使用 fork() 函數創建一個子進程后,該進程繼承父親進程掛載的共享內存。

2.如果調用 exec() 執行一個新的程序,則所有掛載的共享內存將被自動卸載。

3.如果在某個進程中調用了 exit() 函數,所有掛載的共享內存將與當前進程脫離關系。

程序實例

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

#include#include #include #include #include#include#define SHM_SIZE 1024int main()
{
int shm_id, pid;
int *ptr = NULL;

/* 申請共享內存 */

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如何實現進程間共享內存”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

手机| 南宫市| 葫芦岛市| 博乐市| 永年县| 四平市| 赣榆县| 沂水县| 永丰县| 玉山县| 固阳县| 巴马| 南川市| 广东省| 长汀县| 黔南| 万载县| 城固县| 嵊泗县| 越西县| 高雄市| 松阳县| 丹棱县| 阳原县| 上虞市| 长葛市| 江安县| 甘孜县| 辉南县| 辽阳市| 包头市| 玛纳斯县| 娄烦县| 新巴尔虎右旗| 方城县| 长沙市| 响水县| 武定县| 社旗县| 澜沧| 资溪县|