IPC 共享記憶體與訊號燈的基本函式整理

2021-06-21 10:59:44 字數 2625 閱讀 2360

ipc(inter-process communication,程序間通訊)

共享記憶體與訊號燈

#include

#include

key_t ftok(const char *pathname,int proj_id)  

常用方法:key_t key = ftok(".".'a');

if(-1 == key) 

使用key開啟或建立ipc通道(msg_get,shm_get,sem_get)

1、共享記憶體(key、shmid、void *(建立共享記憶體的首位址))

最為高效的程序間通訊

#include

#include

#include

int shmget(key_t,int size,int shm***) 

常用方法: shmid = shmget(key,size,ipc_creat|0666);

if(-1 == shmid)

size 為建立記憶體的大小;

返回值shmid(共享記憶體段的識別符號)

void *shmat(int shmid,const void *shmaddr,int shm***) 

常用方法:char *shmaddr = shmat(shmid,null,0);

if(-1 == shmid)

shmaddr:將共享記憶體對映到指定的位址(null,表示由系統自動分配)

shm***:shm_rdonly(共享記憶體唯讀)  0(共享記憶體可讀寫)

失敗:-1

int shmdt(const void  *shmdt) 銷毀共享記憶體

常用方法:int shmdd = shmdt(shmaddr);

if(-1 == shmdd)

2、訊號燈(system v,由核心維護)

#include

#include

#include

int semget(key_t key,int nsems,int sem***)

常用方法:int semid = semget(key,num,ipc_creat|0666);

if(-1 == semid)

返回值:如果成功,則返回訊號量集的ipc識別符號。如果失敗,則返回-1:

errno = eaccess(沒有許可權)

eexist(訊號量集已經存在,無法建立)

eidrm(訊號量集已經刪除)

enoent(訊號量集不存在,同時沒有使用ipc_creat)

enomem(沒有足夠的記憶體建立新的訊號量集)

enospc(超出限制)

int open_semophore_set(key_t key ,int numsems)

int sid;

sid = semget(key,numsems,ipc_creat|0666);

if(-1 == sid)

return sid;

}int semop(int semid,struct sembuf *sops,size_t nops)

struct sembuf

nops:訊號操作結構的數量,恆大於或等於 1

返回值:成功(0)出錯(-1)

常用方法:

1、p操作

int sem_p(int semid,int index)

return 0;

}2、v操作

int sem_v(int semid,int index);

if(-1 == semop(semid,&buf,1)){

perror("semop");

exit(-1);

}}  

int semctl(int semid,int semnum,int cwd,...../* union semun arg */)

功能描述: 

在指定的訊號集或訊號集內的某個訊號上執行控制操作;

semid: 訊號集的識別符號,即是訊號表的索引。

semnum:訊號集的索引,用來訪問訊號集內的某個訊號。

cmd:   需要執行的命令,有效值有

ipc_stat

//將與semid關聯的核心資料結構拷貝到由arg.buf指標指向的記憶體區。

ipc_set

//將由arg.buf指標指向的semid_ds的一些成員寫入相關聯的核心資料結構, 同時更新它的sem_ctime成員。

ipc_rmid

.....

getval

//根據semnum返回訊號的值。(常用)

setval

//根據semnum設定訊號的值。 (常用)

union semun ;

返回值:

成功執行時,根據不同的命令返回不同的非負值:

getncnt //返回semncnt的值

getpid  //返回sempid的值

getval  //返回semval的值//重點學習

getzcnt //返回semzcnt的值

ipc_info //返回核心內部關於訊號集資訊的最大可用入口索引 

sem_info //如同ipc_info.

sem_stat //返回訊號集標識

剩下的命令返回0。

失敗:-1

預習訊息佇列,共享記憶體,訊號燈

1 對訊息佇列的操作有下面三種型別 1 開啟或建立訊息佇列。訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙個訊息佇列的描述字,只需提供該訊息佇列的鍵值即可。注 訊息佇列描述字是由在系統範圍內唯一的鍵值生成的,而鍵值可以看作對應系統內的一條路經。2 讀寫操作。訊息讀寫...

訊號燈和共享記憶體機制實現程序通訊

父程序建立子程序互相通訊,父程序從指定檔案中每次讀取一行放入共享記憶體中,子程序將共享記憶體的內容寫入另乙個檔案末尾。由於子程序是無限迴圈,父程序結束前必須殺死子程序,程序結束時會釋放掉等待的訊號量,否則再次執行程式時會直接在建立子程序之前阻塞。include include include inc...

IPC程序間的通訊(下篇)共享記憶體和訊號量

共享記憶體的簡單呼叫一般是 鍵值的建立 shmget函式建立共享記憶體空間 shmat函式獲取第乙個可用共享記憶體空間的位址 shmdt函式進行分離 對共享儲存段操作結束時的步驟,並不是從系統中刪除共享記憶體和結構 shmctl函式進行刪除共享儲存空間 我們就可以根據這五個步驟簡單的編寫乙個寫入的 ...