程序間通訊之訊息佇列和訊號量

2021-08-04 07:53:23 字數 4542 閱讀 5458

訊息佇列是ipc物件的一種,由訊息佇列id來唯一標識,訊息佇列就是乙個訊息的列表。使用者可以在訊息佇列中新增訊息、讀取訊息。

訊息佇列可以安裝型別來傳送/接收訊息。

訊息佇列的操作包括:建立或者開啟訊息佇列、新增訊息、讀取訊息、控制訊息

int msgget(key_t key,int flag);

函式引數:

函式返回值: 成功 訊息佇列 id,出錯 -1;

建立的訊息佇列的數量會受到系統訊息佇列數量的限制

int msgsnd(int msqid,const void * msgp,size_t size,int flag);
函式引數:
struct msgbuf;

函式返回值: 成功 0,出錯 -1;
int msgrcv(int msgid,void *msgp,size_t size,long msgtype,int flag)

函式引數:

- msqid: 訊息佇列的id號

- msgp :接收訊息的緩衝區

- size :要接收訊息的位元組數

- msgtype:

1. 0:接收訊息佇列中第乙個訊息

2. 大於0,接收訊息佇列中第乙個型別為 msgtyp的訊息

3. 小於0,接收訊息佇列中型別值不小於msgtyp的絕對值且型別值又最小的訊息

- flag:0,若無訊息,函式會一直阻塞

- ipc_nowait,若無訊息,程序會立即返回enomsg

函式返回值: 成功,接收到的訊息的長度。失敗 返回-1;

int msgctl(int msgqid,int cmd,struct msqid_ds *buf)

函式引數 :

- msgqid 訊息佇列id

- cmd:

1. ipc_stat 讀取訊息佇列的屬性,並將其儲存在buf執行的緩衝區中

2. ipc_set 設定訊息佇列的屬性,這個值取自buf引數

3. ipc_rmid 從系統中刪除訊息佇列

- buf: 訊息佇列緩衝區

函式返回值:成功 0,失敗 -1;

#include 

#include

#include

#include

#include

#include

#define bfusz 512

#define type 100

struct msgbuf;

int main()

if( (qid = msgget(key,ipc_creat|0666)) == -1)

printf("opened queue%d\n",qid);

if( (fgets((&msg)->mtext,bfusz,stdin))==null)

msg.mtype = type;

len = strlen

(msg.mtext)+1;

if( msgsnd(qid,&msg,len,0)<0)

if( msgrcv(qid,&msg,bfusz,0,0)<0)

printf

("message is: %s\n",(&msg)->mtext);

if(msgctl(qid,ipc_rmid,null)<0)

return 0;

}

訊號燈 (semaphore) 也叫做訊號量。它是不同程序間或同一程序內部不同執行緒間同步的機制。

訊號燈種類:

- posix有名訊號燈

- posix基於記憶體的訊號燈(無名訊號燈)

- system v訊號燈(ipc物件)

system v訊號燈是乙個或者多個訊號燈的集合。其中的每乙個都是耽誤的計數訊號燈。而posix訊號燈指的是單個訊號燈

system v訊號燈由核心維護。主要函式semget,semop,semctl

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

函式引數:

- key:和訊號燈集相關聯的key值

- nsems:訊號燈集中包含的訊號燈數目

- sem*** 訊號燈集的訪問許可權 通常為ipc_creat|0666

函式返回值:成功 訊號燈集id

失敗 -1;

int semop(int semid ,struct sembuf * opsptr,size_t nops);

函式引數:

- semid:訊號燈集id

struct sembuf;

函式返回值: 成功 0,失敗 -1;

int semctl(int semid,int semnum,int cmd …/* union semun arg */)

函式引數:

- semid: 訊號燈集 id

- semnum:要修改的訊號燈編號

- cmd:

1. getval:獲取訊號燈的值

2. setval:設定訊號燈的值

3. ipc_rmid:從系統中刪除訊號燈集

函式返回值:成功 0,失敗 -1;

/***********************read************************************/

#include 

#include

#include

#include

#include

#include

#include

#include

union semun ;

#define n 64

#define read 0

#define write 1

void sem_init(int semid, int

array, int n)

return;

}void pv(int semid, int num, int op)

return;

}int main()

; if ((key = ftok(".", 's')) < 0)

if ((semid = semget(key, 2, 0666|ipc_creat|ipc_excl)) < 0)

else

}else

if ((shmid = shmget(key, n, 0666|ipc_creat)) < 0)

shmaddr = (char *)shmat(shmid, null, 0);

while ( 1 )

return

0;}

/**********************************write********************************/

#include 

#include

#include

#include

#include

#include

#include

#include

#include

union semun ;

#define n 64

#define read 0

#define write 1

void sem_init(int semid, int

array, int n)

return;

}void pv(int semid, int num, int op)

int main()

; if ((key = ftok(".", 's')) < 0)

if ((semid = semget(key, 2, 0666|ipc_creat|ipc_excl)) < 0)

else

}else

if ((shmid = shmget(key, n, 0666|ipc_creat)) < 0)

shmaddr = (char *)shmat(shmid, null, 0);

while ( 1 )

shmdt(shmaddr);

shmctl(shmid, ipc_rmid, null);

semctl(semid, 0, ipc_rmid);

return

0;}

程序間通訊 共享記憶體 訊息佇列 訊號量

共享記憶體 共享記憶體是最快的程序間通訊方式,相較於其他程序間通訊方式,少了兩次核心態與使用者態之間的資料拷貝過程 原理及使用過程 在物理記憶體中開闢一塊記憶體空間 將這塊記憶體空間通過頁表對映到程序的虛擬位址空間中 程序可以直接通過程序虛擬位址空間訪問到這塊物理記憶體進行操作 若多個程序對映同一塊...

程序間通訊之訊號量

訊號量的本質是一種資料操作鎖,其本身不具有資料交換的能力,而是通過控制其他的通訊資源 檔案 外部裝置 來實現程序間通訊,它本身只是一種外部資源的標識。訊號量在此過程中負責資料的互斥 同步等功能。當請求乙個訊號量來表示資源時,程序需要讀取訊號量的值來判斷資源是否可用。大於0,資源可以請求,等於0,無資...

程序間通訊之訊號量

訊號量的本質是一種資料操控鎖,它本身不具有資料交換的功能,而是通過來控制其他的通訊資源來實現程序間通訊的,訊號主要負責資料的同步與互斥功能。程序請求乙個使用訊號量來表示的資源時,首先要讀取訊號量的值來判斷資源是否能被使用,若訊號量的值大於0,資源可用,等於0,無資源可用,同時程序會進入睡眠狀態,直到...