iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

Inter-process communication (行程間通訊)

通俗的講 IPC 就是程式和程式之間能夠溝通,最常見的例子就是瀏覽器與 Web 伺服器,瀏覽器作為一個程式,向遠在天邊的 Web 伺服器拿取資料。這邊舉一些 IPC 的例子:

用螢幕截圖軟體截圖儲存成圖檔後用其他軟體開啟→檔案;
玩線上遊戲→Socket;
D-Bus、Pipe 等等都是 IPC 的一種。

資料的生產者與消費者

資料的生產者與消費者這樣的模式在軟體工程中十分常見:
顯卡算圖,演算法就是生產者,螢幕就是消費者;
對 Web 而言,使用者既是生產者(request 的生產者)也是消費者(response 的消費者);
在 ReactiveX 中,事件流的起點就是生產者,事件流的終點就是消費者;
廣義來講 CI/CD 中的 repo 就是生產者,deploy 就是消費者。

說白了,不少軟體就是做著轉換的工作,
把 javascript 轉換成 javascript bundle,
把 sass 轉換成 css,
把 javascript 轉換成 HTML DOM,
把原始碼轉成二進制執行檔,
把 event 轉換成 request,
把 request 轉換成 response,
把 response 轉換成 View...

因為轉換這個行為有輸入、有輸出,理所當然的我們可以像人形蜈蚣一樣,把輸出再倒給另外一個程式的輸入。

stdin, stdout 與 stderr

Unix 的 Standard streams 分別包含了標準輸入 (stdin)、標準輸出 (stdout) 和標準錯誤輸出 (stderr)。

可以把程式想像成有一個輸入的界面 (stdin) 和兩個輸出的界面 (stdout, stderr)。

對於有寫過 C++ 的朋友們,想必對 std:cin 和 std:cout 不會太陌生吧?

#include <iostream>  
using namespace std;  
int main( ) {  
  int age;  
   cout << "Enter your age: ";  
   cin >> age;  
   cout << "Your age is: " << age << endl;  
}  

沒錯,它們就是對應了 stdin 和 stdout。

Pipe

Pipe 是一種 IPC,有操作過 Linux 的朋友應該使用過類似這樣的指令吧?

ls | grep something

這就是一個使用了 pipe 的例子:ls 指令的輸出會倒給 grep,而且這個 pipe 就像人型蜈蚣一樣,可以一直串連接下去。

這裡簡單展示一個比較複雜的 pipe 使用例子:

cat *.png | \
ffmpeg -hide_banner \
-y \
-framerate 20 \
-f png_pipe \
-i pipe:0 \
-c:v libx264 \
-pix_fmt rgb24 \
-r 20 \
-crf 0 \
-f nut \
pipe:1 |
mpv -

這串指令做的事情是這樣的,cat -> ffmpeg -> mpv

  1. cat 把讀取圖片並把資料流送到 stdout
  2. ffmpeg 從 stdpin 擷取 png 資料並轉換成影片後送到 stdout
  3. mpv 從 stding 獲取影像串流後播放到播放器上

上一篇
Day 11 Express 簡介
下一篇
Day 13 Socket.io 簡介
系列文
關於用 Javascript (Typescript) Stack 打造某種 Backend 3D Rendering 的東東這檔事 共 23 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言