1. 程式人生 > >一起talk C栗子吧(第九十五回:C語言例項--使用共享記憶體進行程序間通訊一)

一起talk C栗子吧(第九十五回:C語言例項--使用共享記憶體進行程序間通訊一)

各位看官們,大家好,上一回中咱們說的是SystemV IPC結構概述的例子,這一回咱們說的例子是:使用共享記憶體進行程序間通訊。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

共享記憶體是SystemV IPC結構這種抽象概念的一種具體物件。就和它的名字一樣,它提供了一段記憶體空間供不同的程序使用,程序之間可以通過該記憶體空間傳遞資料,進而實現程序間的通訊。

在介紹共享記憶體的使用方法之前,我們先介紹幾個函式,這些函式都是用來操作共享的記憶體的。

shmget函式

int shmget(key_t key, size_t size,int shmflag)

該函式用來獲取共享記憶體,函式返回共享記憶體的識別符號,我們可以通過該識別符號使用共享記憶體;

  • 第一個引數是鍵值,通過它來操作IPC在核心中的結構,也就是共享記憶體在核心中的結構;(上一回中介紹過)
  • 第二個引數是共享記憶體的容量,單位是byte;
  • 第三個引數是共享記憶體的許可權標記,該許可權和檔案許可權一樣;
  • 該函式執行成功時返回共享記憶體識別符號,否則返回-1;

在使用該函式的時候,我們需要自己定義一個共享記憶體的型別,並且計算出該型別的記憶體空間。共享記憶體的型別可以依據程式需要來定義,常見的是定義一個結構體型別。

shmat函式

void * shmat(int shm_id, const void *shm_addr,int shmflg)

該函式用來把共享記憶體連線到程序的地址空間中,這樣程序就可以使用共享記憶體了;

  • 第一個引數是共享記憶體的識別符號,通過shmget函式可以獲得;
  • 第二個引數是一個地址,該地址表示共享記憶體連線到程序中的位置;
  • 第三個引數是一個位標記,只有三個值供使用:SHM_RND,SHM_RDONLY還有0;
  • 該函式執行成功時返回指向共享記憶體第一個位元組的指標,否則返回-1;

在使用該函式的時候,第二個引數通常使用一個空指標,空指標表示讓系統自己選擇共享記憶體連線到程序地址空間的位置,這時第三引數可以使用SHM_RDONLY或者0。如果給第二個引數指定了地址,那麼第三個引數需要使用SHM_RND。

shmdt函式

int shmdt(const void *shm_addr)

該函式用來把共享記憶體從程序的地址空間中分離出來,分離以後程序就不能使用共享記憶體了;

  • 第一個引數是一個地址,它是共享記憶體第一個位元組的指標,也就是shmat函式的返回值;
  • 該函式執行成功時返回0,否則返回-1;

shmctl函式

int shmctl(int shm_id, int cmd,struct shmid_ds *buf)

該函式用來把共享記憶體連線到程序的地址空間中,這樣程序就可以使用共享記憶體了;

  • 第一個引數是共享記憶體的識別符號,通過shmget函式可以獲得;
  • 第二個引數是一個命令,表示對共享記憶體的操作,只有三個命令供使用:IPC_STAT,IPC_SET和IPC_RMID;
  • 第三個引數是一個結構體指標,該結構體中有共享記憶體的許可權和所有者等資訊;
  • 該函式執行成功時返回0,否則返回-1;

我們通常使用該函式刪除共享記憶體,這時候需要給第二個引數賦值為IPC_RMID,表示刪除共享記憶體,第三引數可以為空指標。第二個引數的另外兩個命令:

  • IPC_STAT表示把第三個引數中的內容和共享記憶體關聯起來;
  • IPC_SET表示把第三個引數中的內容設定為共享記憶體的值。

第三個引數的型別,我們在上一回中提起過,它和SystemV IPC的結構類似,除了必須有的成員外,它還有自己特有的成員。

我從原始碼中找到了第三個引數的型別,詳細的定義如下:(位於linux-4.0.3/include/linux/shm.h檔案中)

struct shmid_kernel /* private to the kernel */
{       
        struct kern_ipc_perm    shm_perm;
        struct file             *shm_file;
        unsigned long           shm_nattch;
        unsigned long           shm_segsz;
        time_t                  shm_atim;
        time_t                  shm_dtim;
        time_t                  shm_ctim;
        pid_t                   shm_cprid;
        pid_t                   shm_lprid;
        struct user_struct      *mlock_user;

        /* The task created the shm object.  NULL if the task is dead. */
        struct task_struct      *shm_creator;
        struct list_head        shm_clist;      /* list by creator */
};

各位看官,關於使用共享記憶體進行程序間通訊的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。

相關推薦

一起talk C栗子C語言例項--使用共享記憶體進行程序通訊

各位看官們,大家好,上一回中咱們說的是SystemV IPC結構概述的例子,這一回咱們說的例子是:使用共享記憶體進行程序間通訊。閒話休提,言歸正轉。讓我們一起talk C栗子吧! 共享記憶體是SystemV IPC結構這種抽象概念的一種具體物件。就和它的

一起talk C栗子C語言實例--使用共享內存進行進程通信二

class mar net 表示 func clas ber 數字 標記 各位看官們。大家好,上一回中咱們說的是使用共享內存進行進程間通信的樣例,這一回咱們接著上一回內容繼續說使用共享內存進行進程間通信。閑話休提,言歸正轉。讓我們一起talk C栗子

一起talk C栗子C語言實例--巧用溢出計算最值

gcc 空間 代碼 讓我 計算 max value 其他 存儲 點擊 各位看官們。大家好,上一回中咱們說的是巧用移位的樣例,這一回咱們說的樣例是:巧用溢出計算最值。 閑話休提,言歸正轉。讓我們一起talk C栗子吧! 大家都知

一起talk C栗子C語言實例--使用信號進行進程通信

split article 語言 方法 pin 第一個 ping num ont 各位看官們,大家好,上一回中咱們說的是進程間通信的樣例。這一回咱們說的樣例是:使用信號進行進程間通信。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 我們在上一

一起talk C栗子第一百二十三C語言實例--顯示變量和函數的地址

調試 ora 部分 example 多線程 ear red 語言 help 各位看官們,大家好,上一回中咱們說的是多線程的樣例。這一回咱們說的樣例是:顯示變量和函數的地址。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 在編敲代碼時,有時候須

Windows上C++使用共享記憶體進行程序通訊

共享記憶體 (也叫記憶體對映檔案) 主要是通過對映機制實現的 , Windows 下程序的地址空間在邏輯上是相互隔離的 , 但在物理上卻是重疊的 ; 所謂的重疊是指同一塊記憶體區域可能被多個程序同時使用

一起talk C栗子一百C語言例項--使用訊號量進行程序同步與互斥

各位看官們,大家好,上一回中咱們說的是程序間同步與互斥的例子,這一回咱們說的例子是:使用訊號量進行程序間同步與互斥。閒話休提,言歸正轉。讓我們一起talk C栗子吧! 看官們,訊號量是由著名電腦科學家迪傑斯特拉(Dijkstra)提出的一種概念,專門用來

一起Talk AndroidAndroid中使用自定義佈局

各位看官們,大家好,上一回中咱們說的是Android中的分隔線的例子,這一回咱們說的例子是Android中使用自定義佈局。閒話休提,言歸正轉。讓我們一起Talk Android吧! 看官們,我們在上一

python學習linux基礎學習

寫入 tool 時區 and 打開 新版 查看 nal mkdir 裝系統 net.ifnames=0 biosdevname=0 修改系統網絡配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 修改ip地址的文件

“全棧2019”Java方法中可以定義靜態區域性內部類嗎?

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第九十五章:方法中可以定義靜態區域性內部類嗎? 下一章 “全棧2019”Java第九十六章:

Windows or Linux環境下利用“共享記憶體”實現程序通訊C/C++程式碼

程序A對應的程式: #include <iostream> #include <windows.h> using namespace std; #define BUF_SIZE 1025 char szName[] = "NameOfMappi

訊號量與共享記憶體實現程序通訊生產者消費者問題為例

(一)訊號量訊號量是IPC的一種,可以看做是一個計數器,計數值為可用的共享資源的數量,訊號量可用於多程序的同步,為多個程序提供對共享資源的訪問。linux下的訊號量的介面函式如下:/*(1)獲取訊號量*/int semget(key_t key, int semnum, in

一起talk C栗子第一百C語言實例--線程死鎖三

取數 string value reading sel 一個 second key 而且 各位看官們。大家好,上一回中咱們說的是線程死鎖的樣例,這一回咱們繼續說該樣例。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 看官們,由於篇幅的原因我們

一起talk C栗子第一百二C語言實例--內置宏

parent tracking 通過 end variable view ddc 工作效率 語法 各位看官們,大家好,上一回中咱們說的是顯示變量和函數地址的樣例,這一回咱們說的樣例是:內置宏。閑話休提,言歸正轉。讓我們一起talk C栗子吧! 看官

一起talk C栗子第一百三C語言實例--C程序內存布局三

view tracking 變化 content easy 內存 ask tex 延伸 各位看官們,大家好。上一回中咱們說的是C程序內存布局的樣例,這一回咱們繼續說該樣例。閑話休提,言歸正轉。讓我們一起talk C栗子吧。 看官們,關於C程序內

【DFS】2018九屆藍橋杯省賽 C/C++ A組

第九題 題目標題:倍數問題【題目描述】眾所周知,小蔥同學擅長計算,尤其擅長計算一個數是否是另外一個數的倍數。但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。現在小蔥給了你 n 個數,希望你從這

python天--js正則

urn python 獲取 text search 大小 regex ace 則表達式 定義正則表達式 /.../ 用於定義正則表達式 /.../g 表示全局匹配 /.../i 表示不區分大小寫 /.../m 表示多行匹配 JS正則匹配時本身就是支持多行,此處多行匹配只是

python學習八天認證組件權限組件與頻率組件

fir setting fun python學習 .data onetoone 超級 .com params 認證組件 認證簡介 只有認證通過的用戶才能訪問指定的url地址,比如:查詢課程信息,需要登錄之後才能查看,沒有登錄,就不能查看,這時候需要用到認證組件 組件的使用

python學習六天linux基礎

systemctl status sshd 檢視sshss -lnupt ss -tnlu 檢視監聽的埠 t tcp u udp n 顯示埠 grep 過濾grep 'root' passwd 查詢帶有root的行grep 'root' passwd /etc/passwd 查詢多個檔案中的grep -e

Visual C++網路程式設計經典案例詳解 3章 多執行緒與非同步套接字程式設計 程序通訊 命名管道 命名管道例項

vc新增控制檯工程 名字命名管道例項 新增原始檔 名字 伺服器 #include<windows.h>                                //包含標頭檔案 #include<stdio.h> int main() {