程序間通訊之

2021-10-07 18:44:03 字數 2008 閱讀 9171

共享記憶體的概述

共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,就好像它們是由用c語言函式malloc分配的記憶體一樣。而如果某個程序向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程序。

共享記憶體的流程:

1 建立或開啟共享記憶體

2 掛接共享記憶體

3 斷開共享記憶體連線

4 刪除共享記憶體

共享記憶體的api

建立或開啟共享記憶體

int shmget(key_t key, size_t size, int flag);

成功返回共享記憶體的id 失敗返回 -1;

第二個size 引數必須是兆的整數倍 (1024*n)

第三個引數,shm***是許可權標誌,它的作用與open函式的mode引數一樣,如果要想在key標識的共享記憶體不存在時,建立它的話,可以與ipc_creat做或操作。共享記憶體的許可權標誌與檔案的讀寫許可權一樣,舉例來說,0644,它表示允許乙個程序建立的共享記憶體被記憶體建立者所擁有的程序向共享記憶體讀取和寫入資料,同時其他使用者建立的程序只能讀取共享記憶體。

掛接共享記憶體

**void shmat(int shm_id, const void addr , int flag);

連線共享記憶體到當前的位址空間;成功返回指向共享的指標,失敗返回-1;

第乙個引數,shm_id是由shmget函式返回的共享記憶體標識。

第二個引數,shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。

第三個引數,shm_***是一組標誌位,通常為0。

斷開與共享記憶體的連線

*int shmdt(void addr);

成功返回 0,失敗返回-1;

控制共享記憶體的相關資訊

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

第二個引數,command是要採取的操作,它可以取下面的三個值 :

ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。

ipc_set:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值。

ipc_rmid:刪除共享記憶體段。

第三個引數,buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。(不關心這些資訊,通常取null)

在這裡插入**片
#include

#include

#include

#include

#include

#include

int main()

shmid=shmget(key,1024*2,ipc_creat|0666);

if(shmid<0)

shmadd=shmat(shmid,null,0);

strcpy(shmadd,"huangshihai");

sleep(5);

shmdt(shmadd);

shmctl(shmid,ipc_rmid,null);

printf("quit\n");

return 0;#include

#include

#include

#include

#include

#include

int main()

shmid=shmget(key,1024*2,0);

if(shmid<0)

shmadd=shmat(shmid,null,0);

printf("%s\n",shmadd);

shmdt(shmadd);

return 0;

程序管理之程序間通訊

四 訊息佇列 message queue 五 共享記憶體 shared memory 六 套接字 socket 程序作為人類的發明,自然也免不了脫離人類的習性,也有通訊的需求。如果程序之間不進行任何通訊,那麼程序所能完成的任務就要大打折扣。人類的通訊方式無外乎對白 通過聲音溝通 打手勢 寫信 發電報...

程序間通訊之困惑

簡單的暴力列舉破解密碼。程式是乙個文字框,乙個按鈕,乙個標籤,標籤顯示當前狀態,ok表示密碼正確,wrong表示密碼錯誤。程式標題logoin,文字框類edit,按鈕標題登入。破解程式主要 如下 hwnd window findwindow null,logoin hwnd edit findwin...

程序間通訊之FIFO

管道使用起來很方便,但是沒有名字,因此只能用於具有親緣關係的程序之間進行通訊,而有名管道就克服了這一點,fifo管道提供了乙個路徑名與之相對應,即使程序不是親緣程序,只要能訪問到該路徑就能使用fifo進行通訊。有名管道的建立 include include int mkfifo const char...