[置頂] Linux 進程間通信(IPC)
來源:程序員人生 發布時間:2016-08-16 18:34:50 閱讀次數:2779次
Linux 進程間通訊(IPC)
說明:首先要聲明1點,我接下來要寫的都針對在面試的時候被問的1些詳解
1、為何要有進程間通訊?
解析:由于進程間通訊主要是強調在不同的進程間交換數據,而數據的交換必須依托內核來實現,任何1個進程的全局變量在另外一個進程中都是看不見的,所之內核開辟了1塊緩沖區,進程A將數據放入內核,進程B從內核將數據取走,就實現了進程間通訊
2、進程間通訊有幾種通訊方式?
解析:pipe、FIFO、system V 消息隊列、system V 信號量、system V 同享內存
3、分別介紹幾種通訊?
解析:pipe(管道):用pipe(int filedes[2])創建管道,創建后的管道有1個讀端和寫端,只能用于具有親緣關系的進程間通訊、單向通訊、基于字節流。
FIFO(命名管道):克服了管道間只能在親緣關系間通訊,它是創建了1個實實在在存在的文件,然后寫端往文件里寫,讀端往文件里讀出數據,總是先進先出,用int mkfifo(const char *filename,mode_t mode)、int mknod(const char *filename,mode_t mode |S_IFIFO,(dev_t)0);創建后的管道可用與任何進程間通訊
最重要的3個進程間通訊來了:(1)system V消息隊列:它是基于消息的消息隊列,也是分別創建讀端和寫端,能用于任何間進程通訊,需要3個函數來實現,int msgget(key_t key,int msgflg):創建消息隊列或獲得已存在的消息隊列,int msgrcv(int msgqid,void *msgp,size_t msgzs,long msgtype,int msgflg):從隊列中取消息,int msgsnd(int msgid,const
void*msgp,size_t msgzs,int msgflg):將數據放入消息隊列中,int msgctl(int msgqid,int cmd,struct msgqid_ds *buf):設置消息隊列屬性
(2)system V信號量:信號量本身不具有讓數據通訊的能力,它相當于1把鎖,它本身只是1種外部資源的標示,用信號量來實現進程的互斥與同步,主要靠 semget,semop,semctl來實現進程通訊,就相當于互斥鎖里的P、V操作
(3)system V同享內存:同享內存是所有IPC中通訊最快的,由于它內存中創建了1份緩沖區,所有的進程都可以被訪問這塊緩沖區,它速度快主要是對數據的訪問只需進行兩次拷貝就可以完成,而其他的進程間通訊都需要4次拷貝才能完成通訊,但它也有1個致命的缺點是在多進程中或在多線程中會出現線程安全,所有同享內存的通訊1般是和信號量或互斥鎖、條件變量集合使用來保證數據的在通訊時候的1致性
ps:
消息隊列、信號量、同享內存都有system V和POSIX之分,他們之間有1些區分,后期會補上
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈