管道 (|) 是 Shell 提供的進程間通信原語,將前一個進程的 stdout 直接連接到後一個進程的 stdin,實現「小工具組合完成複雜任務」的 Unix 哲學。
原始數據 gpsdata.csv:
42.0908,-71.2316,speed=21
37.1908,-74.2322,speed=19
42.0908,-71.3312,speed=20
44.5908,-70.2314,speed=17
39.0908,-62.2512,speed=19
43.0908,-60.1311,speed=16
45.0908,-65.2316,speed=20
需求:篩選緯度在 40~44 之間的記錄,輸出 JSON,不修改原轉換程序。
bermuda.c#include <stdio.h>
int main() {
float lat, lon;
char info[80];
while (scanf("%f,%f,%79[^\n]", &lat, &lon, info) == 3) {
if (lat > 40 && lat < 44) { // 篩選條件
printf("%f,%f,%s\n", lat, lon, info); // 輸出到 stdout
}
}
return 0;
}
編譯:gcc bermuda.c -o bermuda
# 原始轉換程序 json_conv 讀取 stdin 輸出 stdout
# 管道連接:gpsdata.csv → json_conv → bermuda → output.json
$ ./json_conv < gpsdata.csv | ./bermuda > output.json
output.json 將僅包含緯度 40~44 的記錄。
cmd1 | cmd2 時:fork 兩子進程,pipe() 創建管道,dup2 將 cmd1 的 stdout 重定向到管道寫端,cmd2 的 stdin 重定向到管道讀端,關閉多餘描述符,exec 載入程序。無親緣關係進程間也可通信:mkfifo mypipe; ./writer > mypipe & ./reader < mypipe。