IPC 三種通信機制

最近看了,IPC三種通信機制,OK,小寫自己的收穫吧。

IPC三種通信機制是指:信號量、共享內存、消息隊列,一開始看得時候感覺有點吃力,當我模仿書上的程序寫了寫代碼之後,就慢慢的理解了。

信號量:通過操作系統中的PV操作來實現;
共享內存:申請一塊內存,進程A往共享內存中寫,其他的進程就可以通過讀出共享內存中的內容來獲取進程A所傳送的信息;
消息隊列:創建一個消息隊列,進程A往隊列裏面寫,那麼進程B通過讀隊列中的容來獲取進程A傳送的信息。

具體的實現其實就是用三組函數來實現的,而且形式都是很有相似性的。

信號量:
#include<sys/sem.h>
int semget(key_t key,int num_sems,int sem_flgs);
int semctl(int sem_id,int sem_num,int command...);
int semop(int sem_id,struct sembuf *sem_ops,size_t num_sem_ops);

每個函數的功能和參數的意義在手冊中都能找到。


1、semget                創建一個信號量或者獲取一個已知信號量的鍵
key:不相關的進程可以通過他來訪問同一個信號量
num_sems:需要的信號量數目。幾乎總是1
sem_flags:一組標誌,例如IPC_CREAT;
返回值是信號量標誌符,給其他信號量函數使用


2、semctl:
sem_id:信號量標誌符,semget的返回值
sem_ops:信號量編號,一般取0
command:   就不解釋了,在手冊中有詳細的解釋,我就偷偷懶吧。

3、semop
用於改變信號量的值
struct sembuf{
short sen_nums;            //信號量編號,一般取0
short sem_op;               //一般-1是P操作,1是V操作
short sem_flag;            //通常設置爲UNDO
}



共享內存
允許兩個不像關的進程訪問同一個邏輯地址
#include<sys/shm.h>
1、int shmget(key_t key,size_t size,int shmflag);
2、void *shmat(int shm_id,const void *shm_addr,int shm_flag);
3、int shmctl(int shm_id,int cmd,struct shmid_ds *buf);
4、int shmdt(const void *shm_addr);

參數的常用值:
1、shmflag:0666|IPC_CREAT
2、shmaddr=0           shm_flag=0
3、cmd=IPC_SET  cmd=IPC_RMID




消息隊列:
提供從一個進程向另一個進程發送一個數據塊的方法
#include<sys/msg.h>
int msgget(key_t key,int msgflg);
int msgctl(int magid,int cmd,struct msgid_ds *buf);
int msgsnd(int msgid,void *msg_ptr,size_t msg_sz,int msgflag);
int msgrcv(int msgid,void *msg_ptr,size_t msg_sz,long int msg_type,int msgflag);


省略了許多的說明,這些函數使用都可以在手冊中查到。OK! 偷下懶~
轉自:http://blog.chinaunix.net/uid-26125381-id-3206237.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章