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

Win32 行程間通訊 (IPC) 九大機制完整對比與選型指南

     編輯:關於C語言

IPC 機制總覽表

機制跨機器資料類型同步/非同步適用場景複雜度
剪貼板否任意 (標準格式)同步使用者手動複製貼上、少量資料交換低
COM/DCOM是介面方法參數同步/非同步物件導向跨行程/跨機器呼叫、元件重用高
DDE否文字/資料塊非同步舊版應用程式相容 (Excel、Word 早期版本)中
檔案映射否位元組流 (共享記憶體)需自行同步大量資料高速共享、同機器多行程中
郵件槽是 (單向)資料包 (廣播/單播)非同步簡單通知、日誌收集、尋找伺服器低
管道 (無名)否位元組流同步/非同步父子行程標準輸入輸出重導向低
管道 (有名)是位元組流/訊息模式同步/非同步客戶端-伺服器高可靠雙向通訊中
RPC是IDL 定義結構同步/非同步企業級分散式系統、COM 底層極高
Windows Sockets是位元組流/資料包同步/非同步跨平台網路通訊、Web 服務、遊戲中高
WM_COPYDATA否位元組塊同步同桌面視窗行程間簡單資料傳遞極低

核心機制深度解析

檔案映射 — 高速共享記憶體


// 建立/開啟
HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, _T("Global\\MySharedMem"));
LPVOID pView = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// 使用 pView 讀寫,需搭配 Mutex/Event 同步
UnmapViewOfFile(pView); CloseHandle(hMap);
  • 支援大檔案分頁映射 (MapViewOfFileEx 指定位址)。
  • INVALID_HANDLE_VALUE 表示使用系統分頁檔,不持久化。

有名管道 — 可靠雙向通訊


// 伺服器端
HANDLE hPipe = CreateNamedPipe(_T("\\\\.\\pipe\\MyPipe"),
    PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
    PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
    PIPE_UNLIMITED_INSTANCES, 4096, 4096, 0, NULL);
ConnectNamedPipe(hPipe, &overlapped); // 非同步等待連線
// 讀寫用 ReadFile/WriteFile,訊息模式保證邊界

// 客戶端
HANDLE hPipe = CreateFile(_T("\\\\.\\pipe\\MyPipe"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
// 直接 ReadFile/WriteFile

郵件槽 — 輕量廣播


// 伺服器 (接收端)
HANDLE hSlot = CreateMailslot(_T("\\\\.\\mailslot\\MySlot"), 0, MAILSLOT_WAIT_FOREVER, NULL);
ReadFile(hSlot, buf, size, &read, NULL);

// 客戶端 (發送端,可廣播)
HANDLE hSlot = CreateFile(_T("\\\\*\\mailslot\\MySlot"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
WriteFile(hSlot, msg, len, &written, NULL);
  • 單向、不可靠 (資料包可能遺失/亂序)、支援網域廣播 (\\*)。

WM_COPYDATA — 視窗行程最簡 IPC


// 發送端
COPYDATASTRUCT cds = { 0, (DWORD)dataSize, pData };
SendMessage(hTargetWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);

// 接收端 (視窗程序)
case WM_COPYDATA:
    COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
    // 處理 pcds->lpData, 大小 pcds->cbData
    return TRUE;
  • 僅限同桌面互動視窗行程,資料複製兩次 (發送端→核心→接收端),不適合大量資料。

選型決策樹

需要跨機器? → 是 → 需物件導向/標準化? → 是 → COM/DCOM / Web Service (SOAP/REST) / gRPC
                              → 否 → 簡單通知/廣播? → 是 → 郵件槽
                              → 否 → 高效能雙向流? → 是 → 有名管道 / Sockets
                              → 否 → RPC (企業級)
同機器? → 大量資料高速共享? → 是 → 檔案映射 + 同步物件
        → 父子行程標準流? → 是 → 無名管道
        → 視窗行程簡單資料? → 是 → WM_COPYDATA
        → 一般客戶端-伺服器? → 是 → 有名管道 / 本地 Sockets (Loopback)
        → 舊系統相容? → DDE / 剪貼板
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved