進程間的通信方式(IPC)有哪些,各有什么優(yōu)缺點系草?
Linux內(nèi)核解析:進程間通信:管道 - 笨拙的菜鳥 - 博客園
管道通熄,命名管道,信號找都,消息隊列唇辨,信號量,共享內(nèi)存能耻,套接字
1)管道:管道是一種半雙工的通信方式赏枚,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進程之間使用晓猛。進程的親緣關(guān)系通常是指父子進程關(guān)系饿幅。
管道是第一個廣泛應(yīng)用的進程間的通信。日常在終端執(zhí)行shell命令的時候戒职,會用到大量管道栗恩。但管道的缺陷在于只能在有親緣關(guān)系(有共同祖先)的進程間使用。為了突破這個限制洪燥,后來引入了命名管道磕秤。
2)命名管道(FIFO):有名管道也是半雙工的通信方式乳乌,但是允許在沒有親緣關(guān)系的進程間使用,管道是先進先出的通信方式市咆。命名管道在文件系統(tǒng)中有對應(yīng)的文件名钦扭。命名管道通過命令mkfifo或系統(tǒng)調(diào)用mkfifo來創(chuàng)建。
3)信號量:信號量是一個計數(shù)器床绪,可以用來控制多個進程對共享資源的訪問客情。它常作為一種鎖機制,防止某進程正在訪問共享資源時癞己,其他進程也訪問該資源膀斋。因此,主要作為進程間以及同一進程內(nèi)不同線程之間的同步手段痹雅。
4)消息隊列:消息隊列是有消息的鏈表仰担,存放在內(nèi)核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少绩社、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點摔蓝。
5)信號:信號是一種比較復(fù)雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生愉耙。除了用于進程間通信外贮尉,進程還可以發(fā)送信號給進程本身;Linux除了支持Unix早期信號語義函數(shù)sigal外朴沿,還支持語義符合Posix.1標準的信號函數(shù)sigaction猜谚。
6)共享內(nèi)存:共享內(nèi)存就是映射一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建赌渣,但多個進程都可以訪問魏铅。共享內(nèi)存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設(shè)計的坚芜。他往往與其他通信機制览芳,如信號量,配合使用鸿竖,來實現(xiàn)進程間的同步和通信沧竟。
7)套接字(socket):套接字也是一種進程間的通信機制,與其他通信機制不同的是千贯,它可以用于不同機器間的進程通信屯仗。
內(nèi)存映射:允許任何多個進程間通信,每個使用該機制的進程通過把一個共享的文件映射到自己的進程地址空間來實現(xiàn)它搔谴。