天天看點

Qt之程序間通信(IPC)簡述通信目的通信方式Qt程序通信

程序間通信,就是在不同程序之間傳播或交換資訊。那麼不同程序之間存在着什麼雙方都可以通路的媒體呢?程序的使用者空間是互相獨立的,一般而言是不能互相通路的,唯一的例外是共享記憶體區。但是,系統空間卻是“公共場所”,是以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以通路的外設了。在這個意義上,兩個程序當然也可以通過磁盤上的普通檔案交換資訊,或者通過“系統資料庫”或其它資料庫中的某些表項和記錄交換資訊。廣義上這也是程序間通信的手段,但是一般都不把這算作“程序間通信”。

程序間通信(ipc-interprocess communication)是一組程式設計接口,能夠讓程式員協調不同的程序,使之能在一個作業系統裡同時運作。這使得一個程式能夠在同一時間裡處理許多使用者的要求。因為即使隻有一個使用者發出要求,也可能導緻一個作業系統中多個程序的運作,程序之間必須互相通話。ipc接口就提供了這種可能性。每個ipc方法均有自己的優點和局限性,是以,對于單個程式而言使用所有的ipc方法并不常見。

<a href="#%e7%ae%80%e8%bf%b0">簡述</a>

<a href="#%e9%80%9a%e4%bf%a1%e7%9b%ae%e7%9a%84">通信目的</a>

<a href="#%e9%80%9a%e4%bf%a1%e6%96%b9%e5%bc%8f">通信方式</a>

<a href="#qt%e8%bf%9b%e7%a8%8b%e9%80%9a%e4%bf%a1">qt程序通信</a>

<a href="#tcpip">tcpip</a>

<a href="#shared-memory">shared memory</a>

<a href="#d-bus">d-bus</a>

<a href="#qprocess">qprocess</a>

<a href="#session-management">session management</a>

資料傳輸:

一個程序需要将它的資料發送給另一個程序,發送的資料量在一個位元組到幾兆位元組之間。

共享資料:

多個程序想要操作共享資料,一個程序對共享資料的修改,别的程序應該立刻看到。

通知事件:

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

資源共享:

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

程序控制:

有些程序希望完全控制另一個程序的執行(如debug程序),此時控制程序希望能夠攔截另一個程序的所有陷入和異常,并能夠及時知道它的狀态改變。

程序通過與核心及其它程序之間的互相通信來協調它們的行為。linux支援多種程序間通信(ipc)機制,信号和管道是其中的兩種。

管道( pipe ):

管道是一種半雙工的通信方式,資料隻能單向流動,而且隻能在具有親緣關系的程序間使用。程序的親緣關系通常是指父子程序關系。

有名管道 (named pipe) :

有名管道也是半雙工的通信方式,但是它允許無親緣關系程序間的通信。

信号量(semophore) :

信号量是一個計數器,可以用來控制多個程序對共享資源的通路。它常作為一種鎖機制,防止某程序正在通路共享資源時,其它程序也通路該資源。是以,主要作為程序間以及同一程序内不同線程之間的同步手段。

消息隊列(message queue) :

消息隊列就是消息的一個連結清單,存放在核心中并由消息隊列辨別符辨別。消息隊列克服了信号傳遞資訊少、管道隻能承載無格式位元組流以及緩沖區大小受限等缺點。

信号 (signal) :

信号是一種比較複雜的通信方式,用于通知接收程序某個事件已經發生。

共享記憶體(shared memory) :

共享記憶體就是映射一段能被其他程序所通路的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以通路。共享記憶體是最快的 ipc 方式,它是針對其他程序間通信方式運作效率低而專門設計的。它往往與其他通信機制,如信号兩,配合使用,來實作程序間的同步和通信。

套接字(socket) :

套接字也是一種程序間通信機制,與其他通信機制不同的是,它可用于不同及其間的程序通信。

在qt應用程式中,qt提供了幾個方法來實作程序間通信(ipc)。可以在助手中查找關鍵字”inter-process”進行查找。

跨平台的qt network子產品提供的類可以讓網絡程式設計更加便攜和友善。它提供了進階類(例如:qnetworkaccessmanager、qftp)通信,使用特定的應用程式級協定,和較底層的類(例如:qtcpsocket、qtcpserver、qsslsocket)用于實作協定。

跨平台的qsharedmemory-共享記憶體類,提供對作業系統的共享記憶體的實作。它允許多個線程和程序安全通路共享記憶體段。此外,qsystemsemaphore可以用來控制通路由系統共享的資源,以及程序之間的通信。

qt的d-bus子產品是一種可用于使用d-bus協定實作ipc的唯一unix庫。它将qt的信号和槽機制延伸到ipc級别,允許由一個程序發出的信号被連接配接到另一個程序的槽。qt的d-bus文檔已經詳細說明如何使用qt中的d-bus子產品。

跨平台類qprocess可以用于啟動外部程式作為子程序,并與它們進行通信。它提供了用于監測和控制該子程序狀态的api。另外,qprocess為從qiodevice繼承的子程序提供了輸入/輸出通道。

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