国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux進程間通信(IPC)全解析:從管道到?Socket,一篇講透

jf_44130326 ? 2025-11-14 21:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux世界里,進程并非孤立存在。無論是后臺服務協作(如Web服務器與數據庫)、命令行工具聯動(如ps | grep),還是復雜應用的模塊通信,都離不開進程間通信(IPC,Inter-Process Communication)

今天我們就來系統梳理Linux中最常用的6種IPC方式,從原理到實例,從流程到適用場景,幫你徹底搞懂進程間如何“對話”。

一、管道:最簡單的“單向傳送帶”

管道是Linux中最古老的IPC方式,本質是內核中的一塊緩沖區,類似“傳送帶”——數據從一端寫入,從另一端讀出。

1.匿名管道(Pipe):只認“自家人”

特點

?半雙工(數據只能單向流動),需創建兩個管道實現雙向通信;

?僅用于有親緣關系的進程(父子、兄弟進程,通過fork繼承管道描述符);

?隨進程退出自動銷毀,不占用磁盤空間。

實例:父子進程用匿名管道聊天

父進程寫消息,子進程讀消息:

#include#include#includeintmain(){ intpipefd[2]; // 管道描述符:[0]讀端,[1]寫端 pipe(pipefd); // 創建匿名管道 pid_tpid = fork(); // 創建子進程(繼承管道描述符) if(pid ==0) {   // 子進程:讀數據   close(pipefd[1]); // 關閉寫端(只需要讀)   charbuf[100];   read(pipefd[0], buf,sizeof(buf)); // 從管道讀   printf("子進程收到:%sn", buf);   close(pipefd[0]);  }else{      // 父進程:寫數據   close(pipefd[0]); // 關閉讀端(只需要寫)   char*msg ="Hi,我是父進程!";   write(pipefd[1], msg,strlen(msg)+1); // 寫入管道   close(pipefd[1]);  } return0;}

通信流程

wKgZO2kXJXyAF0XMAAFmOnKhsIs747.png

2.命名管道(FIFO):陌生人也能聊

特點

?與匿名管道功能類似,但通過文件系統中的路徑標識(如/tmp/myfifo);

?可用于無親緣關系的進程(只要知道FIFO路徑就能通信);

?是特殊文件(用mkfifo創建),但數據仍存于內存,不落地。

實例:兩個獨立進程通過FIFO通信

寫進程(writer.c):

#include#include#include#includeintmain(){ mkfifo("/tmp/myfifo",0666); // 創建FIFO文件 intfd =open("/tmp/myfifo", O_WRONLY); // 打開寫端 char*msg ="來自陌生進程的消息"; write(fd, msg,strlen(msg)+1); close(fd); return0;}

讀進程(reader.c):

#include#include#include#includeintmain(){ intfd =open("/tmp/myfifo", O_RDONLY); // 打開讀端(會阻塞到有寫端打開) charbuf[100]; read(fd, buf,sizeof(buf)); printf("收到:%sn", buf); close(fd); return0;}

通信流程

wKgZO2kXJXyAB2iXAAGA-MuPqdg347.png

二、信號:進程間的“緊急電報”

信號是Linux中最“輕量”的IPC方式,用于通知進程發生了某種事件(如異常、用戶指令),類似“緊急電報”。

特點

?異步通信(無需進程主動等待);

?攜帶信息少(僅一個信號編號);

?內核負責遞送(進程可注冊處理函數)。

常用信號

?SIGINT(2):用戶按Ctrl+C,默認終止進程;

?SIGTERM(15):請求進程終止(默認行為);

?SIGUSR1/SIGUSR2(10/12):用戶自定義信號。

實例:進程A給進程B發“自定義電報”

進程B(接收方):

#include#include// 信號處理函數voidhandle_usr1(intsig){ printf("收到SIGUSR1信號!n");}intmain(){ signal(SIGUSR1, handle_usr1); // 注冊信號處理函數 printf("我是進程B,PID:%d,等待信號...n",getpid()); while(1); // 無限循環等待 return0;}

進程A(發送方):

#include#includeintmain(){ pid_tb_pid =12345; // 進程B的PID(需替換為實際值) kill(b_pid, SIGUSR1); // 發送SIGUSR1信號給B printf("已發送SIGUSR1給進程%dn", b_pid); return0;}

通信流程

wKgZO2kXJXyAJXitAAFd21mNM-0050.png

三、共享內存:最快的“公共黑板”

共享內存是速度最快的IPC方式——多個進程直接訪問同一塊物理內存,無需內核“中轉”數據。

特點

?無數據拷貝(直接操作內存),效率極高;

?需要同步機制(如信號量)防止“同時寫”沖突;

?由內核管理(用shmget創建,shmctl銷毀)。

實例:兩個進程共享一塊內存

寫進程(shm_write.c):

#include#include#includeintmain(){ key_tkey =ftok(".",123); // 生成唯一鍵值 intshmid =shmget(key,1024, IPC_CREAT|0666); // 創建共享內存(大小1024字節) char*shmaddr =shmat(shmid,NULL,0); // 關聯到進程地址空間 strcpy(shmaddr,"共享內存中的數據"); // 寫入數據 shmdt(shmaddr); // 解除關聯 return0;}

讀進程(shm_read.c):

#include#includeintmain(){ key_tkey =ftok(".",123); // 相同鍵值 intshmid =shmget(key,1024,0666); // 獲取共享內存 char*shmaddr =shmat(shmid,NULL,0); // 關聯到地址空間 printf("讀到共享數據:%sn", shmaddr); // 讀取數據 shmdt(shmaddr); // 解除關聯 shmctl(shmid, IPC_RMID,NULL); // 刪除共享內存 return0;}

通信流程

wKgZO2kXJXyAWH-SAAHJn84RCPc718.png

四、消息隊列:帶“標簽”的“郵件箱”

消息隊列是內核中的消息鏈表,每個消息有“類型標簽”,進程可按類型接收,類似“帶標簽的郵件箱”。

特點

?數據有結構(消息類型+數據),支持按類型讀取;

?異步通信(發送方無需等待接收方);

?有大小限制(內核參數MSGMAX控制單條消息最大長度)。

實例:按類型發送/接收消息

發送進程(msg_send.c):

#include#include#include// 消息結構(必須以long mtype開頭)structmsgbuf{ longmtype; // 消息類型(正數) charmtext[100]; // 消息內容};intmain(){ key_tkey =ftok(".",456); intmsqid =msgget(key, IPC_CREAT|0666); // 創建消息隊列 structmsgbufmsg;  msg.mtype =1; // 類型為1 strcpy(msg.mtext,"類型1的消息"); msgsnd(msqid, &msg,sizeof(msg.mtext),0); // 發送消息 return0;}

接收進程(msg_recv.c):

#include#includestructmsgbuf{ longmtype; charmtext[100];};intmain(){ key_tkey =ftok(".",456); intmsqid =msgget(key,0666); // 獲取消息隊列 structmsgbufmsg; msgrcv(msqid, &msg,sizeof(msg.mtext),1,0); // 只接收類型1的消息 printf("收到類型%d的消息:%sn", msg.mtype, msg.mtext); msgctl(msqid, IPC_RMID,NULL); // 刪除消息隊列 return0;}

通信流程

wKgZO2kXJX2AemTTAAH-Chbfbrg478.png

五、信號量:進程同步的“紅綠燈”

信號量不是用于傳遞數據,而是控制多個進程對共享資源的訪問(如共享內存、文件),類似“紅綠燈”。

核心概念

?信號量值(semaphore):>=0的整數,代表“可用資源數”;

?P操作(等待):信號量值- 1,若值< 0?則阻塞;

?V操作(釋放):信號量值+ 1,若有進程阻塞則喚醒。

實例:用信號量保護共享內存

(基于共享內存,添加信號量控制):

#include// 定義P/V操作(簡化版)voidP(intsemid){ structsembufs = {0,-1,0}; // 第0個信號量,-1(P操作) semop(semid, &s,1);}voidV(intsemid){ structsembufs = {0,1,0}; // +1(V操作) semop(semid, &s,1);}// 初始化信號量(值為1,代表互斥)intinit_sem(){ key_tkey =ftok(".",789); intsemid =semget(key,1, IPC_CREAT|0666); semctl(semid,0, SETVAL,1); // 第0個信號量值設為1 returnsemid;}// 寫進程在訪問共享內存前P,寫完V;讀進程同理

同步流程

wKgZO2kXJX2AIGuDAAG5yFL1gdY006.png

六、Socket:跨主機通信的“萬能接口

Socket(套接字)是最靈活的IPC方式,不僅支持同一主機的進程通信,還能跨網絡(如服務器與客戶端)。

特點

?支持TCP(可靠、面向連接)和UDP(不可靠、無連接);

?本地通信可用AF_UNIX協議(通過文件路徑標識);

?網絡通信用AF_INET協議(通過IP +端口標識)。

實例:本地Socket通信(AF_UNIX)

服務器(sock_server.c):

#include#include#include#include#includeintmain(){ intsockfd =socket(AF_UNIX, SOCK_STREAM,0); // 創建本地套接字 structsockaddr_unaddr;  addr.sun_family = AF_UNIX; strcpy(addr.sun_path,"/tmp/mysock"); // 本地路徑 bind(sockfd, (structsockaddr*)&addr,sizeof(addr)); // 綁定 listen(sockfd,5); // 監聽 intconnfd =accept(sockfd,NULL,NULL); // 接受連接 charbuf[100]; read(connfd, buf,sizeof(buf)); printf("收到:%sn", buf); close(connfd); close(sockfd); unlink("/tmp/mysock"); // 刪除套接字文件 return0;}

客戶端(sock_client.c):

#include#include#include#include#includeintmain(){ intsockfd =socket(AF_UNIX, SOCK_STREAM,0); structsockaddr_unaddr;  addr.sun_family = AF_UNIX; strcpy(addr.sun_path,"/tmp/mysock"); connect(sockfd, (structsockaddr*)&addr,sizeof(addr)); // 連接服務器 char*msg ="本地Socket消息"; write(sockfd, msg,strlen(msg)+1); close(sockfd); return0;}

通信流程

wKgZO2kXJX2AGrT1AAFrtXkKlrQ220.png

總結:如何選擇合適的IPC方式?

方式 速度 復雜度 適用場景
匿名管道 父子進程簡單單向通信
命名管道 無親緣關系進程簡單通信
信號 快(異步) 事件通知(如異常、退出)
共享內存 最快 高(需同步) 高頻、大數據量共享
消息隊列 需按類型傳遞消息的場景
信號量 進程同步與互斥(配合其他IPC)
Socket 較慢 跨主機或復雜通信(如網絡服務)

進程間通信是Linux開發的核心基礎,理解每種方式的優缺點,才能在實際場景中“對癥下藥”。比如日志收集可用命名管道,實時數據共享用共享內存+信號量,網絡服務則離不開Socket。

你在開發中用過哪種IPC方式?遇到過哪些坑?歡迎在評論區交流~

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11608

    瀏覽量

    217666
  • IPC
    IPC
    +關注

    關注

    3

    文章

    375

    瀏覽量

    54502
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux進程通信方式-管道

    Linux進程通信方式-管道分享: 本文關鍵字: l
    發表于 08-29 15:29

    Linux學習雜談】之進程通信

    我們詳細看下進程通信大致分為以下幾個方面: Linux進程
    發表于 10-15 14:45

    進程通信之:管道

    | grep ntp為例,描述管道通信過程,如圖8.2所示。 圖8.2 管道通信過程 管道Lin
    發表于 10-18 16:06 ?0次下載
    <b class='flag-5'>進程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>之:<b class='flag-5'>管道</b>

    Linux進程通信

    進程通信IPC)以下以幾部分發展而來:早期UNIX進程
    發表于 04-02 14:46 ?646次閱讀

    Linux進程通信方式——管道

    管道Linux進程通信種方式,它把個程序
    發表于 06-01 09:13 ?1734次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>方式——<b class='flag-5'>管道</b>

    嵌入式Linux進程 -進程通信

    最常用的無名管道,有名管道,消息隊列,信號,信號量,共享內存等進程通信方式。其實后面網絡通信
    發表于 11-01 17:20 ?9次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>進程</b> -<b class='flag-5'>進程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>

    Linux進程通信方法之管道

    上文中我們介紹了進程通信的方法之:信號,本文將繼續介紹另進程
    的頭像 發表于 05-14 15:47 ?2562次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>方法之<b class='flag-5'>管道</b>

    Linux進程的五種通信方式介紹 1

    進程通信IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。
    的頭像 發表于 02-15 10:18 ?1874次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>間</b>的五種<b class='flag-5'>通信</b>方式介紹 1

    Linux進程的五種通信方式介紹 2

    進程通信IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。
    的頭像 發表于 02-15 10:19 ?922次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>間</b>的五種<b class='flag-5'>通信</b>方式介紹 2

    Linux進程的五種通信方式介紹 3

    進程通信IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。
    的頭像 發表于 02-15 10:19 ?876次閱讀

    Linux進程的五種通信方式介紹 4

    進程通信IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。
    的頭像 發表于 02-15 10:19 ?1033次閱讀

    Linux進程的五種通信方式介紹 6

    進程通信IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。
    的頭像 發表于 02-15 10:19 ?826次閱讀

    Linux進程的五種通信方式介紹 5

    進程通信IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。
    的頭像 發表于 02-15 10:20 ?955次閱讀

    如何實現linux進程通信的機制

    我們知道linux進程通信的組件有管道,消息隊列,socket, 信號量,共享內存等。但是
    的頭像 發表于 11-10 14:56 ?1064次閱讀
    如何實現<b class='flag-5'>一</b>套<b class='flag-5'>linux</b><b class='flag-5'>進程</b><b class='flag-5'>間</b><b class='flag-5'>通信</b>的機制

    linux管道概述

    進程通信IPC)介紹 進程
    的頭像 發表于 02-18 14:51 ?927次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>管道</b>概述