03 linux下程序通訊 共享記憶體

2022-10-10 05:39:08 字數 2270 閱讀 7799

接下來我們介紹一種簡單而高效的程序間通訊的方式!

共享記憶體

注意了是通訊也就是資料交換,如果要想避免同時讀寫發生的同步問題就得需要其他機制!

在實際程式設計中,常用的同步機制有 訊號量、傳遞訊息(使用管道或ipc訊息)、生成訊號。

但是在這次的實現裡面我們用自己提供的非常醜陋的同步標誌written_by_you,它是乙個非常缺乏效率的忙等待(不停地迴圈)。

首先是標頭檔案

//shm_com.h

#define text_sz 2048

struct shared_use_st ;

#include #include #include #include #include //相關的主要函式

#include "shm_com.h"

int main()

//消費者訪問記憶體 (即將共享記憶體的位址對映到自己程序)

//**第二個引數指定的是共享記憶體連線到當前程序中的位址位置,它通常是乙個空指標,表示讓系統來選擇共享記憶體出現的位址。**

//第三個引數是一組標誌。它的兩個的可能取值為shm_rnd(這個標誌與第二個引數聯合使用用來控制共享記憶體連線的位址)和shm_rdonly(它使得連線的 記憶體唯讀)。

shared_memory = shmat(shmid, (void*)0, 0);

if (shared_memory == (void*)-1)

printf("memory attached at %x\n", (int)shared_memory);

//程式的下一部分將shared_memory分配給shared_stuff,然後它輸出written_by_you中的文字

//迴圈將一支執行到在written_by_you中找到end字元為止。

//sleep呼叫強迫消費者程式在臨界區多呆一會,讓生產者程式等待

shared_stuff = (struct shared_use_st*)shared_memory;

shared_stuff->written_by_you = 0;

while (running)

} }//shmdt函式 將共享記憶體分離,是shmat的反向操作

if (shmdt(shared_memory) == -1)

/*小課堂shmid_ds結構體*/

/*struct shmid_ds

*///shmctl 共享記憶體的控制函式。

//第乙個引數為 識別符號

//第二個引數 為 命令:ipc_stat(將shmid_ds結構中的資料設定為共享內的當前關聯值)、ipc_set(如果當前程序有足夠的許可權,就把共享記憶體的關聯值設定為shmid_ds結構中給出的值)、ipc_rmid(刪除共享記憶體段)

if (shmctl(shmid, ipc_rmid, 0) == -1)

exit(exit_success);

}

#include #include #include #include #include #include "shm_com.h"

int main()

//生產者訪問共享記憶體

shared_memory = shmat(shmid, (void*)0, 0);

if (shared_memory == (void*)-1)

printf("memory attached at %x\n", (int)shared_memory);

shared_stuff = (struct shared_use_st*)shared_memory;

while (running)

printf("enter some text: ");

fgets(buffer, bufsiz, stdin);

strncpy(shared_stuff->some_text, buffer, text_sz);

shared_stuff->written_by_you = 1;

if (strncmp(buffer, "end", 3) == 0)

} //分離共享記憶體

if (shmdt(shared_memory) == -1)

exit(exit_success);

}

儘管使用的是同一塊實體地址,在各個程序中的位址也不同 啊!

程序通訊基礎03 Linux訊號(一)

struct sigaction結構體 例子ctrl c 2 sigint 終止 中斷 int interrupt ctrl z 20 sigtstp 暫停 停止 t terminal 終端。ctrl 3 sigquit 退出 除0操作 8 sigfpe 浮點數例外 f float 浮點數。非法訪問...

Ubuntu下Linux程序間通訊 共享記憶體

linux提供了多種程序間通訊的方法,常見有管道 匿名 fifo 有名管道 訊息佇列 訊號量 共享記憶體,socket通訊。linux程序間通訊 匿名管道 linux程序間通訊 fifo 有名管道 linux程序間通訊 訊息佇列 linux程序間通訊 訊號量 linux程序間通訊 共享記憶體 5.共...

Linux下程序間通訊 共享記憶體

接下來總結程序間通訊的另外一種方式 共享記憶體。1 概念 共享記憶體是一種最為高效的程序間通訊方式,指兩個或多個程序共享乙個給定的儲存區。它通過核心物件將程序中的虛擬位址對映到相同的物理記憶體上,因此系統分配共享記憶體是按照 頁 為單位。2 特點 共享記憶體是最快的一種 ipc,因為程序是直接對記憶...