作業系統 程序間通訊函式

2021-09-22 21:29:26 字數 3545 閱讀 9092

一、程序間通訊之訊息佇列

「訊息佇列」是在訊息的傳輸過程中儲存訊息的容器。

對訊息佇列有寫許可權的程序可以向訊息佇列中按照一定的規則新增新訊息;對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。

訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。

訊息佇列也有類似管道一樣的不足,就是每個訊息的最大長度是有上限的(msgmax),每個訊息佇列的總的位元組數是有上限的(msgmnb),系統上訊息佇列的總數也有乙個上限(msgmni)。

1.msgget函式

功能: 用於建立乙個新的或開啟乙個已經存在的訊息佇列

原型:int msgget(key_t key, int msgflag);
2.msgctl函式

功能:系統呼叫對msqid標識的訊息佇列執行cmd操作列,即msgctl函式為訊息佇列的控制函式

原型:int msgctl(int msqid,int cmd,struct msqid_ds *buf);
3.msgsnd函式

功能:將乙個新的訊息寫入佇列

原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);
4.msgrcv函式

功能:從訊息佇列中讀取訊息

原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);
某些引數:

msqid:訊息佇列的識別碼

msgp:指向訊息緩衝區的指標,此位置用來暫時儲存傳送和接收的訊息,是乙個使用者可定義的通用結構,形態如下:

struct msgbuf ;

msgsz:訊息的大小

msgtyp:訊息型別

msgtyp等於0 則返回佇列的最早的乙個訊息。

msgtyp大於0,則返回其型別為msgtyp的第乙個訊息。

msgtyp小於0,則返回其型別小於或等於mtype引數的絕對值的最小的乙個訊息。

(2)訊息佇列函式(msgget、msgctl、msgsnd、msgrcv)及其範例

(3)msgctl詳解

(4)msgget詳解

(5)linux程序間通訊(七):訊息佇列 msgget()、msgsend()、msgrcv()、msgctl()

(6)linux c學習筆記----訊息佇列(ftok,msgget,msgsnd,msgrcv,msgctl)

二、程序間通訊之共享記憶體

共享記憶體是 unix下的多程序之間的通訊方法 ,這種方法通常用於乙個程式的多程序間通訊,實際上多個程式間也可以通過共享記憶體來傳遞資訊。
1.shmget函式

功能:得到乙個共享記憶體識別符號或建立乙個共享記憶體物件

原型:int shmget(key_t key, size_t size, int shm***);
2.shmat函式
原型:void *shmat(int shmid, const void *shmaddr, int shm***);
3.shmctl函式

功能:共享記憶體管理

原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
4.shmdt函式

功能:斷開共享記憶體連線

原型:int shmdt(const void *shmaddr);

(2)linux程序間通訊(六):共享記憶體 shmget()、shmat()、shmdt()、shmctl()

三、程序間訊號量

標頭檔案 #include
1.sem_init函式

功能:建立訊號量,或初始化乙個定位在 sem 的匿名信號量

原型:int sem_init(sem_t *sem, int pshared, unsigned int value);
2.sem_wait函式

功能:sem_wait是乙個函式,也是乙個原子操作,它的作用是從訊號量的值減去乙個「1」,但它永遠會先等待該訊號量為乙個非零值才開始做減法

原型:int sem_wait(sem_t * sem);
sem_trywait(sem_t *sem)是函式sem_wait的非阻塞版,它直接將訊號量sem減1,同時返回錯誤**。

3.sem_post函式

功能:sem_post是給訊號量的值加上乙個「1」,它是乙個「原子操作」,即同時對同乙個訊號量做加「1」操作的兩個執行緒是不會衝突的;而同時對同乙個檔案進行讀和寫操作的兩個程式就有可能會引起衝突

原型:int sem_post(sem_t *sem);
4.semget函式

功能:建立乙個新訊號量或取得乙個已有訊號量,即獲取與某個鍵關聯的訊號量集標識

原型:int semget(key_t key,int nsems,int sem***);
訊號量集被建立的情況有兩種:

1.如果鍵的值是ipc_private。

2.或者鍵的值不是ipc_private,並且鍵所對應的訊號量集不存在,同時標誌中指定ipc_creat。

5.semop函式

功能:改變訊號量的值。當它的值大於 0 時,表示當前可用的資源數的數量;當它的值小於 0 時,其絕對值表示等待使用該資源的程序個數。訊號量的值僅能由 pv 操作來改變

原型:int semop(int semid,struct sembuf *sops,size_t nsops);
6.semctl函式

功能:直接控制訊號量資訊,即系統呼叫semctl用來執行在訊號量集上的控制操作

原型:int semctl(int sem_id, int sem_num, int command, ...);

如果有第四個引數,它通常是乙個union semum結構,定義如下:

union semun ;

(2)linux程序間通訊(五):訊號量 semget()、semop()、semctl()

作業系統 程序間通訊

程序間通訊涉及到3個問題 1.乙個程序如何把資訊傳遞給另乙個程序 2.確保兩個或多個程序之間不會在關鍵活動中出現交叉 3.程序間執行的順序對執行結果的影響。注意 確保程序對臨界區的 互斥 訪問。忙等待的互斥 1.遮蔽中斷 當乙個程序進入臨界區後立即遮蔽所有中斷,時鐘中斷也被遮蔽 這樣cpu就不會進行...

作業系統 程序間通訊

include include include include include include ifndef semun h 條件編譯,即若semun在標頭檔案中沒有被定義,就進行下面的編譯 define semun h union semun endif static int set semval...

作業系統 程序間通訊

程序間通訊方式總結 優缺點 linus下的程序通訊手段基本上是從unix平台上的程序通訊手段繼承而來的。1 無名管道通訊 半雙工通訊,只能在具有親緣關係的程序間使用 1 管道 2 高階管道通訊 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子 程序 3 有名管道通訊 半雙工通訊...