【Qt】Qt之進程間通信(IPC)【轉】


簡述

進程間通信,就是在不同進程之間傳播或交換信息。那么不同進程之間存在着什么雙方都可以訪問的介質呢?進程的用戶空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享內存區。但是,系統空間卻是“公共場所”,所以內核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩個進程當然也可以通過磁盤上的普通文件交換信息,或者通過“注冊表”或其它數據庫中的某些表項和記錄交換信息。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”。

進程間通信(IPC-Interprocess communication)是一組編程接口,能夠讓程序員協調不同的進程,使之能在一個操作系統里同時運行。這使得一個程序能夠在同一時間里處理許多用戶的要求。因為即使只有一個用戶發出要求,也可能導致一個操作系統中多個進程的運行,進程之間必須互相通話。IPC接口就提供了這種可能性。每個IPC方法均有自己的優點和局限性,因此,對於單個程序而言使用所有的IPC方法並不常見。

通信目的

  • 數據傳輸:
    一個進程需要將它的數據發送給另一個進程,發送的數據量在一個字節到幾兆字節之間。

  • 共享數據:
    多個進程想要操作共享數據,一個進程對共享數據的修改,別的進程應該立刻看到。

  • 通知事件:
    一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。

  • 資源共享:
    多個進程之間共享同樣的資源。為了作到這一點,需要內核提供鎖和同步機制。

  • 進程控制:
    有些進程希望完全控制另一個進程的執行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,並能夠及時知道它的狀態改變。

進程通過與內核及其它進程之間的互相通信來協調它們的行為。Linux支持多種進程間通信(IPC)機制,信號和管道是其中的兩種。

通信方式

  • 管道( pipe ):
    管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。

  • 有名管道 (named pipe) :
    有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。

  • 信號量(semophore) :
    信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其它進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。

  • 消息隊列(message queue) :
    消息隊列就是消息的一個鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。

  • 信號 (signal) :
    信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。

  • 共享內存(shared memory) :
    共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。

  • 套接字(socket) :
    套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。

Qt進程通信

在Qt應用程序中,Qt提供了幾個方法來實現進程間通信(IPC)。可以在助手中查找關鍵字”Inter-Process”進行查找。

TCP/IP

跨平台的Qt Network模塊提供的類可以讓網絡編程更加便攜和方便。它提供了高級類(例如:QNetworkAccessManager、QFtp)通信,使用特定的應用程序級協議,和較底層的類(例如:QTcpSocket、QTcpServer、QSslSocket)用於實現協議。

Shared Memory

跨平台的QSharedMemory-共享內存類,提供對操作系統的共享內存的實現。它允許多個線程和進程安全訪問共享內存段。此外,QSystemSemaphore可以用來控制訪問由系統共享的資源,以及進程之間的通信。

D-Bus

Qt的D-Bus模塊是一種可用於使用D-Bus協議實現IPC的唯一Unix庫。它將Qt的信號和槽機制延伸到IPC級別,允許由一個進程發出的信號被連接到另一個進程的槽。Qt的D-Bus文檔已經詳細說明如何使用Qt中的D-Bus模塊。

QProcess

跨平台類QProcess可以用於啟動外部程序作為子進程,並與它們進行通信。它提供了用於監測和控制該子進程狀態的API。另外,QProcess為從QIODevice繼承的子進程提供了輸入/輸出通道。

Session Management

在Linux/X11平台上,Qt提供了會話管理的支持。會話允許事件傳播到進程,例如,當檢測到關機時。進程和應用程序可以執行任何必要的操作,例如:保存打開的文檔。


原文作者:一去丶二三里
作者博客:去作者博客空間


免責聲明!

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



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