1. 程式人生 > >Linux 共享記憶體 .

Linux 共享記憶體 .

一、概念

共享記憶體是被多個程序共享的一部分實體記憶體,是程序間共享資料的最快的一種方法。

二、實現

分為兩個步驟:

1、建立共享記憶體。

2、對映共享記憶體。

1、建立

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

當key的取值為 IPC_PRIVATE 時,將建立一塊新的共享記憶體。shmflg至少設為S_IRUSR|S_IWUSR否則會出現讀寫錯誤。成功返回記憶體標示符,失敗返回-1。

2、對映

   int shmat(int shmid, char *shmaddr, int flag)

shmaddr為共享記憶體的起始地址。flag對記憶體的操作模式。通常命令可寫為:shmat(shmid,NULL,0);

成功返回共享記憶體的起始地址,失敗返回-1。

三、舉例

[cpp] view plaincopyprint?
  1. #include<sys/stat.h>
  2. #include<sys/ipc.h>
  3. #include<sys/shm.h>
  4. #include<memory.h>
  5. #include<fcntl.h>
  6. #define PERM S_IRUSR|S_IWUSR
  7. int main(int argc ,char *argv[]){  
  8. int shmid;  
  9.         pid_t pid;  
  10. if(argc!=2){  
  11.                 printf("Usage: shmA [string]\n");  
  12. return -1;   
  13.         }  
  14. if((shmid=shmget(IPC_PRIVATE,1024,PERM))<0){  
  15.                 printf("shared memory create error!\n");  
  16.                 _exit(1);  
  17.         }  
  18. char *p;  
  19.         pid=fork();  
  20. if(pid ==0){  
  21.                 sleep(1);  
  22.                 p=shmat(shmid,NULL,0);  
  23.                 memset(p,'\0',1024);  
  24.                 strcpy(p,argv[1]);  
  25.                 printf("already written!!! It's %s \n",p);  
  26.         }  
  27. else{  
  28.                 wait(NULL);  
  29.                 p = shmat(shmid,NULL,0);  
  30.                 printf("read from memory %s \n",p);  
  31.         }  
  32. return 0;  
  33. }  
#include<sys/stat.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<memory.h>
#include<fcntl.h>
#define PERM S_IRUSR|S_IWUSR

int main(int argc ,char *argv[]){
        int shmid;
        pid_t pid;
        if(argc!=2){
                printf("Usage: shmA [string]\n");
                return -1; 
        }
        if((shmid=shmget(IPC_PRIVATE,1024,PERM))<0){
                printf("shared memory create error!\n");
                _exit(1);
        }
        char *p;
        pid=fork();
        if(pid ==0){
                sleep(1);
                p=shmat(shmid,NULL,0);
                memset(p,'\0',1024);
                strcpy(p,argv[1]);
                printf("already written!!! It's %s \n",p);
        }
        else{
                wait(NULL);
                p = shmat(shmid,NULL,0);
                printf("read from memory %s \n",p);
        }
        return 0;
}
       

子程序寫入argv[1],父程序輸出argv[1]的值。

相關推薦

Linux:共享記憶體

概念: 共享記憶體區是最快的IPC形式。⼀一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再 涉及到核心,換句話說是程序不再通過執⾏行進⼊入核心的系統調⽤用來傳遞彼此的資料。 共享記憶體中的函式: shmget函式: 功能:⽤用來建立共享記

程序間通訊之Linux共享記憶體程式設計

共享記憶體 共享記憶體(Shared Memory)是指多個程序共享一段指定的記憶體空間進行資料互動,三種System V IPC機制(另外兩種是訊號量和訊息佇列)中共享記憶體是速度最快的一種。 共享記憶體機制是最快的一種程序間通訊(Interprocess Commun

Linux 程式設計1:深入淺出 Linux 共享記憶體

筆者最近在閱讀Aerospike 論文時,發現了Aerospike是利用了Linux 共享記憶體機制來實現的儲存索引快速重建的。這種方式比傳統利用索引檔案進行快速重啟的方式大大提高了效率。(減少了磁碟 i/o,但是缺點是耗費記憶體,並且伺服器一旦重啟之後就只能冷重啟了~~)而目前筆者工作之中維護的 No

(轉)Linux共享記憶體使用常見陷阱與分析(4)-共享記憶體刪除的陷阱

轉自http://os.51cto.com/art/201311/418977_3.htm 共享記憶體刪除的陷阱? 當程序結束使用共享記憶體區時,要通過函式 shmdt 斷開與共享記憶體區的連線。該函式宣告在 sys/shm.h 中,其原型如下: #include #

(轉)Linux共享記憶體使用常見陷阱與分析(3)-ftok是否一定會產生唯一的key值

轉自http://os.51cto.com/art/201311/418977_2.htm ftok是否一定會產生唯一的key值? 系統建立IPC通訊(如訊息佇列、共享記憶體時)必須指定一個ID值。通常情況下,該id值通過ftok函式得到。 ftok原型如下: ke

linux 共享記憶體 總結

 共享記憶體可以說是最有用的程序間通訊方式,也是最快的IPC形式。兩個不同程序A、B共享記憶體的意思是,同一塊實體記憶體被對映到程序A、B各自的程序地址空間。程序A可以即時看到程序B對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,

Linux 共享記憶體 .

一、概念 共享記憶體是被多個程序共享的一部分實體記憶體,是程序間共享資料的最快的一種方法。 二、實現 分為兩個步驟: 1、建立共享記憶體。 2、對映共享記憶體。 1、建立   int shmget(key_t key, int size, int shmflg

linux 共享記憶體(shmget,shmat,shmdt,shmctl)解析

shmget int shmget(key_t key, size_t size, int shmflg); key:     識別符號的規則 size:    共享儲存段的位元組數 flag:    讀寫的許可權還有IPC_CREAT或IPC_EXCL對應檔案的O_CREAT或O_EXCL 返回值: 

Linux共享記憶體與互斥鎖

Linux共享記憶體 共享記憶體是從系統的空閒記憶體池中分配,並希望訪問它的每個程序都能連線它。連線的過程稱為對映。對映後,每個程序都可通過訪問自己的記憶體而訪問共享記憶體區域,進而與其它程序進行通訊。 共享記憶體相關函式 開啟建立共享記憶體檔案 int shm_op

Linux共享記憶體物件,shm_open,mmap

Linux共享記憶體物件 概述 linux下,每個程序都有自己擁有的記憶體區域,程序的記憶體總是私有的。共享記憶體是從系統的空閒記憶體池中分配的,希望訪問它的每個程序連線它。這個連線過程稱為對映。對映後,每個程序都可通過訪問自己的記憶體而訪問共享記憶體區域,

修改linux共享記憶體大小

這是實際linux系統顯示的實際資料: [email protected]:/proc/sys/kernel$ cat shmmax  33554432 [email protected]:/proc/sys/kernel$ cat shmmni

Linux共享記憶體和cache

申請以下共享記憶體,不對其進行初始化,共享記憶體大小為56600032bytes:  此時free:             total       used       free     shared    buffers     cachedMem:       3932

Linux-程序通訊-訊息佇列/訊號燈/共享記憶體

訊息佇列     訊息佇列提供了程序間傳送資料塊的方法,每個資料塊都可以被認為是有一個型別,接受者接受的資料塊可以有不同的型別;我們可以通過傳送訊息來避免命名管道的同步和阻塞問題;訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制;我們可以將每個資料塊當作是一

c/c++ linux 程序間通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

Linux:程序間通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

Linux(高階程式設計)8————程序間通訊4(共享記憶體

共享記憶體是什麼? 因為程序之間是相互獨立的,他們有各自程序地址空間,那麼他們需要通訊時就要藉助核心來為他們建立橋樑,像之前我們瞭解的管道、訊息佇列就是核心做的工作來為程序間通訊架的橋樑。共享記憶體也是核心為程序間通訊駕的一座橋樑,只不過這座橋樑比其他橋樑更優,共享記憶體是核心為需要通訊

Linux系統程式設計—共享記憶體之mmap

共享記憶體概念 共享記憶體是通訊效率最高的IPC方式,因為程序可以直接讀寫記憶體,而無需進行資料的拷備。但是它沒有自帶同步機制,需要配合訊號量等方式來進行同步。 共享記憶體被建立以後,同一塊實體記憶體被對映到了多個程序地址空間,當有一個程序修改了共享記憶體的資料,其餘的程序均可看見所修改的內容,反之亦然。

Linux 通過共享記憶體機制實現程序間通訊

問題背景 編寫程式 sender ,它建立一個共享記憶體,然後等待使用者通過終端輸入一串字元,並將這串字元通過共享記憶體傳送給 receiver;最後,它等待 receiver 的應答,收到應答訊息後,將接收到的應答資訊顯示在終端螢幕上,刪除共享記憶體,結束程式的執行。 編寫 receiver 程

Linux共享記憶體實現

c程式實現 寫記憶體 讀記憶體 執行結果 總結 c程式實現 寫記憶體 /* * rShareM.c * * Created on: 2011-11-20 * Author: snape */ #include &

Linux關於程序間通訊共享記憶體

共享記憶體概念 共享記憶體允許兩個不相關的程序去訪問同一部分邏輯記憶體 如果需要在兩個執行中的程序之間傳輸資料,共享記憶體將是一種效率極高的解決方案 共享記憶體是由IPC為一個程序建立的一個特殊的地址範圍,它將出現在程序的地址空間中。 其他程序可以把同一段共享記憶體段“連