1. 程式人生 > >Linux程序間通訊--共享記憶體與訊號量

Linux程序間通訊--共享記憶體與訊號量

1. 建立共享記憶體,shmget()
shmget(建立或開啟共享記憶體)
表頭檔案#include <sys/ipc.h>
#include <sys/shm.h>
函式定義  int shmget(key_t key, size_t size, int shmflg);
函式說明key:IPC_PRIVATE或ftok的返回值,標識的ID
       size:共享記憶體區大小。shmflg:同 open函式的許可權位,也可以用8進製表示法
返回值:成功返回記憶體識別符號,錯誤返回-1
#define IPC_CREAT01000/* Create key if key does not exist. */
#define IPC_EXCL02000/* Fail if key exists.  */
#define IPC_NOWAIT04000/* Return error on wait.  */
2. 對映共享記憶體,把建立的共享記憶體對映到具體的程序空間,shmat()
shmat(對映共享記憶體)
表頭檔案#include <sys/types.h>
      #include <sys/shm.h>
函式定義void *shmat(int shmid, const void *shmaddr, int shmflg);


函式說明shmid:要對映的共享記憶體區識別符號
shmaddr:將共享記憶體對映到指定地址(若為NULL,則表示由系統自動完成對映)
shmflg:SHM_RDONLY:共享記憶體只讀,預設為0,共享記憶體可讀寫
返回值:成功對映後的地址,錯誤:-1
3. 撤銷對映shmdt()
shmdt(共享記憶體從程序中分離出來)
表頭檔案:  #include <sys/types.h>
         #include <sys/shm.h>
函式定義:  int shmdt(const void *shmaddr);
函式說明:shmaddr:共享記憶體後對映的地址
返回值:成功0,錯誤-1
案例:建立一個共享記憶體區,之後建立子程序,在父子兩個程序中將共享記憶體
分別對映到各自的地址空間中
父程序先等待使用者輸入,然後使用者輸入的字串寫入到共享記憶體,之後往共享
記憶體的頭部寫入WROTE字串表示程序已成功寫入資料。子程序一直等到共享
記憶體的頭部字串為WROTE,然後將共享記憶體的有效資料(在父程序中使用者輸入的字串)
在螢幕上列印。父子兩個程序在工作之後,分別解除與共享記憶體的對映關係。
用標誌字串來實現父子之間的同步
命令ipcs,用於報告程序間通訊機制狀態的命令,它可以檢視共享記憶體,訊息佇列
等各種程序間通訊機制的情況,用system()函式呼叫shell命令ipcs

相關推薦

Linux程序通訊--共享記憶體訊號

1. 建立共享記憶體,shmget() shmget(建立或開啟共享記憶體) 表頭檔案#include <sys/ipc.h>#include <sys/shm.h> 函式定義  int shmget(key_t key, size_t size, int shmflg); 函式說明k

程序程式設計之程序通訊-共享記憶體訊號和套接字

1. 背景 本文將介紹程序通訊中的訊號量,共享記憶體和套接字方法。 2. 訊號量 2.1 訊號量的定義 為了防止出現因多個程式同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有一個執行執行緒

Linux 程序通訊(四)訊號

1 訊號量概述 訊號量和其他IPC不同,並沒有在程序之間傳送資料,訊號量用於多程序在存取共享資源時的同步控制就像交通路口的紅路燈一樣,當訊號量大於0,表示綠燈允許通過,當訊號量等於0,表示紅燈,必須停下來等待綠燈才能通過。 程序間的互斥關係與同步關係存在的根源在於臨界資

Linux程序通訊(四)訊號

雖然本文是記錄使用訊號量保證程序的同步與互斥的,但是其實也可以看做是程序之間的通訊問題,為了與前面的保持一致,所以還是叫做 Linux程序間通訊了 (強迫症...) 訊號量 基本概念 程序間通訊的方式有管道、訊息佇列、共享記憶體這些都是程序間的資訊通訊,而訊號量可以理解為程序使用的臨界資源的狀態說明,訊

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

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

Linux環境程序通訊——共享記憶體

原文連結     原文連結:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 概述     Android系統中大量使用了mmap實現的共享記憶體,所以這裡需要介紹一下LInux程序間通訊

php程序通訊--共享記憶體

php如何實現共享記憶體。(注意:本示例是在linux下,請勿在windows下嘗試此程式碼,並且必須是在php-cli模式下) php提供了兩種實現共享記憶體的擴充套件。下面我們來一一講解。   一、shmop 系類函式 <?php $shm_key = ftok(__FILE

程序通訊——共享記憶體(Shared Memory)簡易原理和建立_獲得函式

共享記憶體是System V版本的最後一個程序間通訊方式。共享記憶體,顧名思義就是允許兩個不相關的程序訪問同一個邏輯記憶體,共享記憶體是兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常為同一段實體記憶體。程序可以將同一段實體記憶體連線到他們自己的地址空間中,所有

程序通訊--共享記憶體

共享記憶體 當一個程式想和另外一個程式通訊的時候,那記憶體將會為這兩個程式生成一塊公共的記憶體區域。這塊被兩個程序分享的記憶體區域叫做共享記憶體 共享記憶體是程序間通訊最簡單的一種,共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不

程序通訊---共享記憶體

一、IPC(Inter-Process Communication,程序間通訊)物件的介紹 System V 的IPC物件有共享記憶體、訊息佇列、訊號燈。 注意:在IPC的通訊模式下,不管是使用訊息佇列還是共享記憶體,甚至是訊號燈,每個IPC的物件都有唯一的名

Windows程序通訊-共享記憶體

#include "stdafx.h" #include "windows.h" //Name given to the pipe #define g_szPipeName "\\\\.\\Pipe\\MyNamedPipe" //Pipe name format - \\.\pipe\pipename

Qt程序通訊——共享記憶體

       Qt提供了一種安全的共享記憶體的實現QSharedMemory,以便在多執行緒和多程序程式設計中安全的使用。比如說QQ的聊天的客戶端,這裡有個個性頭象,當點選QQ音樂播放器的時候,QQ

程序通訊——共享記憶體(Shared Memory)

共享記憶體是System V版本的最後一個程序間通訊方式。共享記憶體,顧名思義就是允許兩個不相關的程序訪問同一個邏輯記憶體,共享記憶體是兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常為同一段實體記憶體。程序可以將同一段實體記憶體連線到他

Linux程序通訊(三)訊號

IPC操作時IPC_CREAT和IPC_EXCL選項的說明 IPC(包括訊息佇列,共享記憶體,訊號量)的xxxget()建立操作時,可以指定IPC_CREAT和IPC_EXCL選項。 以共享記憶體為例: 當只有IPC_CREAT選項開啟時,不管是否已存在該

Linux程序通訊--訊號,管道,訊息佇列,訊號共享記憶體,socket

Linux 傳統的程序間通訊有很多,如各類管道、訊息佇列、記憶體共享、訊號量等等。但它們都無法介於核心態與使用者態使用,原因如表 通訊方法 無法介於核心態與使用者態的原因 管道(不包括命名管道) 侷限於父子程序間的通訊。 訊息佇列 在硬、軟中斷中無法無阻塞地接收資料。 訊號量 無法介於核

Linux程序通訊訊號(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory)

System V 程序通訊方式:訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory) 訊號量 訊號量(semaphore)實際是一個整數,它的值由多個程序進行測試(test)和設定(set)。就每個程序所關心的測試和

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

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

Linux 程序通訊(六)共享記憶體

可以說, 共享記憶體是一種最為高效的程序間通訊方式, 因為程序可以直接讀寫記憶體, 不需要任何資料的複製。 為了在多個程序間交換資訊, 核心專門留出了一塊記憶體區, 這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。 因此, 程序就可以直接讀寫這一記憶體區而不需要

程序通訊(二)共享記憶體訊號

本片部落格會貼上部分程式碼,想要了解更多程式碼資訊,可訪問小編的GitHub關於本篇的程式碼 共享記憶體 這裡有涉及的mmap的知識 下圖為共享記憶體原理圖 因為共享記憶體是直接將申請來的一塊實體記憶體對映到虛擬地址空間中,允許兩個或多個程序共享,因此進行

linux程序通訊———記憶體共享

共享記憶體(shared memory):是linux下的多程序之間的通訊方法,這種方法通常用於一個程式的多程序間通訊,實際上多個程式間也可以通過共享記憶體來傳遞資訊。共享記憶體指在多處理器的計算機系統中,可以被不同中央處理器(CPU)訪問的大容量記憶體。由於多