Windows與Linux下進程間通信技術比較


一般我們寫的程序都是以單個進程的方式來運行的,比較少涉及到多進程。特別是在windows下,因為Windows是按照線程來分配CPU時間片的,線程是最小的調度單位,所以在Windows下更多的用到多線程,在同一個進程里創建多個線程來執行不同的任務,達到充分利用CPU的目的。線程之間可以共享進程的資源,比如內存、變量,但是多線程有一個不好的地方,由於這些線程是在同一個進程空間里執行,所以只要一個線程崩潰,整個進程也就崩潰了,程序就退出了。多進程由於是在不同的進程空間里,一個進程崩潰,不會影響到其它的進程,但是進程之間要交換信息的話,就比較麻煩了,不像多線程可以簡單的通過一個全局變量來通訊。為了解決進程間交換信息的問題,所以操作系統提供了進程間通訊(IPC)的技術。

1、管道(Pipe)
一個進程往管道里寫數據,另一個進程從管道里取數據。管道又可以分為匿名管道,匿名管道只能在父、子進程之間通訊。還有一種命名管道(named pipes),Linux下叫做FIFO,命名管道可以在任意進程之間通訊。

2、油槽(Slot)
Linux下叫做消息隊列(Message)。就像我們日常通過郵局寄送信件。一個進程寄送,另一個進程接收。

3、消息(Message)
Linux下叫做信號(Signal)。Windows是消息驅動的,進程可以調用WIN32 API函數SendMessage或者PostMessage向另一個進程發送消息,Windows系統也可以向進程發送消息。
Linux下可以通過kill、raise、alarm、pause這些信號處理系統調用來實現。

4、共享內存(Shared Memory)
進程之間通過共享一塊內存的方式來交換數據。

5、Socket
通常我們使用socket來進行網絡通訊,一方作為客戶機,另一方作為服務器。同樣的,socket也可以作為進程之間通訊的一種方式。

以上方式是Windows和Linux共有的通訊方式。Windows下進程之間還可以通過系統剪貼板的方式來通訊,一個進程把數據復制到剪貼板,另一個進程把數據從剪貼板上粘貼過來。

其實除了以上這些比較常用的通訊方式,個人認為還可以通過文件的方式。一個進程把數據寫入文件,另一個進程從文件里讀取數據。

當然還可以通過一個中間件的方式,比如Windows下的msmq(消息隊列)中間件,Apache上也提供了一個用Java寫的開源消息中間件Apache ActiveMQ。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM