1. 程式人生 > 其它 >程序間通訊基本概念

程序間通訊基本概念

程序間通訊

每個程序的地址空間都是獨立的,所以要通訊,就要通過核心實現

管道

匿名管道:比如dmesg | grep ov13850命令中的|就是一個管道;也可通過int pipe(int fd[2])系統呼叫建立兩個讀寫的檔案描述符,通過fork建立子程序,會複製檔案描述符,直接在各自程序讀寫,就達到了通訊的目的,由於是fifo所以不能lseek等操作

命名管道:通過int mkfifo( const char *pathname, mode_t mode)建立型別為管道的檔案,在各自程序開啟這個檔案,讀寫就能通訊了

訊息佇列

就是儲存在核心中的訊息連結串列;通過int msgget(key_t key, int msgflg);開啟一個現存佇列或新建一個佇列

再通過int msgsnd(int msgid, const void* msgp, size_t msgsz, long msgtyp, int msgflg)int msgrcv(int msgid, void *msgp, size_t msgsz, long msgtyp, int msgflg)傳送和接收訊息

與管道不同的是消除了管道的同步和阻塞問題,而且可以有選擇的接收資料

共享記憶體

以上兩種都會產生使用者態跟核心態之間的資料複製操作,共享記憶體讓不同程序的使用者虛擬地址去對映同一塊實體記憶體;通過指標讀寫,大大提高通訊效率;對於產生的競爭操作可通過訊號量來實現對共享資源的同步與互斥

通過int shmget( key_t, size_t, flag)開啟或新建一塊核心空間;再通過void *shmatint shmidconst void *shmaddr,int shmflg返回當前程序的一個使用者虛擬地址,再操作指標就可以了

訊號

是唯一的非同步通訊機制,比如通過ctrl + c,kill

Socket

服務端通過socket,bind,listen,accept,客戶端通過connect建立連線,再通過read,write進行讀寫操作,達到通訊的目的