概念
IPC = 電腦裡不同process之間的「溝通方式」, 讓它們可以協同工作, 而不是各做各的。想像你的server裡面就像是一個大型辦公室, 辦公室裡面有很多員工在執行不同的工作, 就像…Process在執行不同的任務, 執行任務的時候可能會有一些結果或狀態需要被儲存。 假如該員工負責溫度的探測, 那麼幾點幾分探測到不同sensor的溫度值就應該被完整的記錄下來, 這時候有另外一名員工, 他負責風扇的轉速調整, 他需要sensor的資訊來判斷現在系統是不是過熱, 需要增加風扇的轉速, 但是他本身沒有sensor的資料, 所以他就要透過IPC的機制, 去告訴負責sensor探測與紀錄的員工, 向他索取資料。這就是Process之間的溝通與協作。
員工和員工之間的溝通方式有很多種, 你可以是傳紙條, 也可以發個message, 或是email…etc. Process跟Process之間溝通的方式也有很多種, 以下直接幫大家列一個表格來瞧瞧。生活比喻的這一欄, 對純資工系畢業的我來說覺得有點硬凹, 但是又想要用一個比較生活化的方式讓完全沒有接觸過這個領域的朋友能在腦中有一些想像和畫面, 如果你原本不是這樣的背景, 我覺得可以先簡單這樣理解, 然後再去慢慢研究他的細節, 甚至寫code去實作, 以至於可以真正的懂他的用法還有特點。

不得不提一下~ Sysfs
傳統的 IPC(Inter-Process Communication)指的是作業系統在不同user space的process之間提供的通訊機制。這些機制的共同特點是:雙方都是獨立的 process,透過作業系統的 API 交換資料,由 kernel 負責資料在 process 間的傳遞與同步控制。相比之下,sysfs 並不是傳統意義上的 IPC,而是 Linux kernel 提供給user space的虛擬檔案系統介面(通常掛載在 /sys 目錄下),讓使用者空間的應用程式可以透過讀寫檔案的方式,存取 kernel 物件的property或驅動程式提供的status資訊。對應的讀寫動作會由 kernel 轉換為驅動程式對硬體的操作。
在嵌入式系統中,sysfs 常用於讀取感測器數據(如溫度、電壓), 檢查系統狀態(如開機原因、韌體版本), 控制裝置行為(如開關 LED、設定頻率), 以及操作 GPIO 腳位等。它的優點是介面簡單、易於除錯, 開發者可以直接用 cat、echo 等命令進行存取, 無需撰寫複雜的通訊程式碼。
之所以會這麼突然的想講這個, 一方面是因為他使用到的機率真的好高, 二來是power control的code隨便一滑就有看到…類似 bmc_state_manager.cpp 中, 有個函式 discoverLastRebootCause() 會讀取:/sys/class/watchdog/watchdog0/bootstatus, 這就是很典型的使用方式。Sysfs 提供了一個簡單的檔案介面, 而kernel 驅動已經幫你對接硬體狀態, 讀取檔案就能拿到結果來判斷上一次重啟的原因。
以上, 我們講了IPC又講了Sysfs, 那把它們串起來會是什麼概念呢?想像一下這個流程:
- 有一支driver去跟硬體sensor, controller…etc拿了一個資訊回來, 更新到Sysfs的某一個目錄
- 某 X application到這個Sysfs的目錄下把值讀回來(可以是polling也可以是event trigger的方式), 並且慷慨地把它放在D-bus的某一個Object Path, interface ….property上面。
- 其他的applications可以註冊signal, 等待這個值有變化再去讀, 又或者直接去property把值讀回來…etc.
皆大歡喜!!所有需要這個值的應用程式都可以順利的得到他了!


















