接下來我們介紹一種簡單而高效的程序間通訊的方式!
共享記憶體
注意了是通訊也就是資料交換,如果要想避免同時讀寫發生的同步問題就得需要其他機制!
在實際程式設計中,常用的同步機制有 訊號量、傳遞訊息(使用管道或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,因為程序是直接對記憶...