共享記憶體 訊號量

2021-10-23 18:23:56 字數 1496 閱讀 3506

1.共享記憶體

a. int shmget(key_t key, size_t size, int shm***); //建立共享記憶體

參一:為共享記憶體段命名 參二:size以位元組為單位指定需要共享的記憶體容量 參三:許可權標誌 ipc_creat|0644 返回值:共享記憶體識別符號(非負整數)

b.void *shmat(int shm_id, const void *shm_addr, int shm***);//第一次建立完共享記憶體時,啟動對該共享記憶體的訪問

參一:共享記憶體識別符號

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

參三:shm_***是一組標誌位,通常為0。

返回值:呼叫成功時返回乙個指向共享記憶體第乙個位元組的指標,如果呼叫失敗返回-1.

c.int shmdt(const void *shmaddr);//該函式用於將共享記憶體從當前程序中分離

參一: b的返回值

d.int shmctl(int shm_id, int command, struct shmid_ds *buf);//用來控制共享記憶體

參一:共享記憶體識別符號。

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

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

ipc_rmid:刪除共享記憶體段

第三個引數,buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。

例shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|ipc_creat);

shm = shmat(shmid, 0, 0)

if (shmdt(shm) == -1)

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

2.訊號量

a.int semget(key_t key, int num_sems, int sem_flags);//建立新訊號量或取已有訊號量

參一:引數key是整數值(唯一非零),不相關的程序可以通過它訪問乙個訊號量

參二:訊號量數目//幾乎為1

參三:標誌位 ipc_creat

返回值:成功返回乙個相應訊號識別符號(非零),失敗返回-1.

b.int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);//改變訊號量的值

參一:訊號標誌符

c.int semctl(int sem_id, int sem_num, int command, …);//直接控制訊號量資訊

參一:訊號標誌符

參三:setval:用來把訊號量初始化為乙個已知的值。p 這個值通過union semun中的val成員設定,其作用是在訊號量第一次使用前對它進行設定。

ipc_rmid:用於刪除乙個已經無需繼續使用的訊號量識別符號。

共享記憶體,訊號量

一.共享記憶體 共享記憶體 允許兩個不相關的程序訪問同乙個邏輯記憶體。為兩個正在執行的程序之間共享和傳遞資料不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,是非同步通訊,也就是說,在第乙個程序結束對共享記...

共享記憶體和訊號量

共享記憶體和訊號量實現程序間通訊的另外兩種機制。一.共享記憶體 1.共享記憶體的結構 2.實現共享記憶體的函式 1 shmget 函式 功能 建立共享記憶體 引數 key 共享記憶體的名字 size 共享記憶體的大小 以頁為單位分配資源 返回值 成功返回乙個非負整數,即共享記憶體的識別符號 失敗返回...

共享記憶體 訊號量 例項

include include include include include include include define maxshm 5 定義緩衝區陣列的下標變數個數 定義3個訊號量的內部標識 int fullid int emptyid int mutexid 主函式 int main sl...