首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 管道機制:連接進程標準輸入輸出

     編輯:關於C語言

Linux 管道機制:連接進程標準輸入輸出

管道 (|) 是 Shell 提供的進程間通信原語,將前一個進程的 stdout 直接連接到後一個進程的 stdin,實現「小工具組合完成複雜任務」的 Unix 哲學。

場景:GPS 數據篩選

原始數據 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,不修改原轉換程序。

步驟 1:編寫篩選器 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

步驟 2:管道組合

# 原始轉換程序 json_conv 讀取 stdin 輸出 stdout
# 管道連接:gpsdata.csv → json_conv → bermuda → output.json
$ ./json_conv < gpsdata.csv | ./bermuda > output.json

output.json 將僅包含緯度 40~44 的記錄。

管道優勢

  1. 解耦:每個程序單一職責(轉換 / 篩選 / 統計 / 格式化),獨立開發測試。
  2. 組合:像積木一樣任意組合,無需重寫代碼。
  3. 流式處理:無需載入整個文件到記憶體,適合大數據/串流場景。
  4. 並行:管道兩端進程並發運行,OS 自動調度緩衝區流控。

管道內部原理

  • 管道是內核維護的環形緩衝區(默認 64KB),有讀端、寫端文件描述符。
  • 寫端寫滿阻塞,讀端讀空阻塞,實現流控。
  • Shell 執行 cmd1 | cmd2 時:fork 兩子進程,pipe() 創建管道,dup2 將 cmd1 的 stdout 重定向到管道寫端,cmd2 的 stdin 重定向到管道讀端,關閉多餘描述符,exec 載入程序。

命名管道 (FIFO)

無親緣關係進程間也可通信:mkfifo mypipe; ./writer > mypipe & ./reader < mypipe。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved