0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux進(jìn)程間通信趣味介紹

深圳東裕光大 ? 來(lái)源:編程技術(shù)宇宙 ? 作者:軒轅之風(fēng)O ? 2021-08-27 10:28 ? 次閱讀

?月黑風(fēng)高夜,突然聽(tīng)得咣當(dāng)一聲,Web服務(wù)器的目錄下冒出了兩個(gè)文件,弄出了不小的聲響。這兩個(gè)家伙一胖一瘦,鬼鬼祟祟,潛入這臺(tái)計(jì)算機(jī),不知要搞什么名堂?!岸埽粫?huì)兒咱們按照計(jì)劃好的運(yùn)行起來(lái),分頭行事,你等我信號(hào),拿到數(shù)據(jù)后趕緊撤”,胖子對(duì)瘦子說(shuō)到?!袄洗螅@地方我不熟悉,我怎么等你信號(hào)?咱們得想個(gè)聯(lián)系方式,一會(huì)兒通信使用”,瘦子說(shuō)到。“這個(gè)不用擔(dān)心,主人都交代好了”,胖子一邊說(shuō),一邊從背后拿出一本 《Linux進(jìn)程間通信手冊(cè)》 翻了起來(lái)。

信號(hào)

翻開(kāi)手冊(cè)的第一頁(yè),上面寫(xiě)著:信號(hào)——Signal,兩個(gè)家伙開(kāi)始認(rèn)真研究起來(lái)。片刻之后,胖子程序說(shuō)道:“唉,這個(gè)不行,往后翻吧!”瘦子程序不解,問(wèn)道:“咋就不行啦?”“你看這里,手冊(cè)上說(shuō)了,信號(hào)是Linux上的一種軟中斷通信機(jī)制,可以向指定進(jìn)程發(fā)送通知,總共有64種信號(hào),不過(guò)這個(gè)信號(hào)只能作為通知使用,沒(méi)辦法傳輸數(shù)據(jù)”

“沒(méi)法傳輸數(shù)據(jù)?那這玩意有什么用?”“還是有用啊,可以通知某個(gè)進(jìn)程發(fā)生了什么事件,比如kill命令就是利用這個(gè)信號(hào)來(lái)告知進(jìn)程退出從而實(shí)現(xiàn)殺進(jìn)程的效果的”“原來(lái)如此”,瘦子程序若有所思的點(diǎn)了點(diǎn)頭,此時(shí)胖子已經(jīng)翻到了手冊(cè)的第二頁(yè)。

socket

“你看,手冊(cè)上寫(xiě)了,可以用socket”,胖子說(shuō)到。“socket?那不是網(wǎng)絡(luò)通信使用的嗎?”,瘦子有些疑惑。“是啊,不過(guò)咱們一樣可以用來(lái)在本地計(jì)算機(jī)通信,把連接的IP地址換成127.0.0.1就行了”“感覺(jué)有點(diǎn)太招搖了,咱們計(jì)算機(jī)內(nèi)部進(jìn)程通信,數(shù)據(jù)還要經(jīng)過(guò)網(wǎng)卡,很容易被發(fā)現(xiàn)的!”“不會(huì)不會(huì),手冊(cè)上說(shuō)了,127.0.0.1是本地回環(huán)地址,數(shù)據(jù)在協(xié)議棧就進(jìn)行轉(zhuǎn)發(fā)了,根本不會(huì)到達(dá)網(wǎng)卡”

“那抓包能抓到咱們通信嗎?”“嗯,讓我看看···手冊(cè)上說(shuō),可以在虛擬的回環(huán)網(wǎng)卡lo上抓到數(shù)據(jù)”“還是算了吧,咱干這事得悄悄進(jìn)行,不能留下痕跡,你再看看還有沒(méi)有別的招”聽(tīng)瘦子這么一說(shuō),胖子倒也覺(jué)得有理,便在手冊(cè)上繼續(xù)翻了起來(lái)。

匿名管道

“哎,有了有了,這個(gè)叫匿名管道的,聽(tīng)起來(lái)就比較隱秘,應(yīng)該不會(huì)被發(fā)現(xiàn)?!笔葑咏舆^(guò)手冊(cè),看了起來(lái)。這倆盯著手冊(cè)上的兩個(gè)圖研究了半天,總算弄明白了,所謂匿名管道不過(guò)是內(nèi)核中的一段緩沖區(qū),提供了讀寫(xiě)兩個(gè)口子,通過(guò)fork創(chuàng)建子進(jìn)程后,子進(jìn)程繼承了父進(jìn)程的管道信息,兩邊只要約定好,一個(gè)讀,一個(gè)寫(xiě),就能實(shí)現(xiàn)通信了。

“老大,這匿名管道是單向的,咱們要通信,得整兩根管道才行,一個(gè)你寫(xiě)我讀,一個(gè)我寫(xiě)你讀”“看起來(lái)挺靠譜,就這么干!”,二人達(dá)成了一致。胖子程序率先運(yùn)行起來(lái),隨后創(chuàng)建了兩個(gè)管道,一個(gè)用來(lái)發(fā)送消息,一個(gè)用來(lái)接收消息。接著執(zhí)行fork,將瘦子程序也運(yùn)行了起來(lái)。

時(shí)間過(guò)的很快,轉(zhuǎn)眼已是深夜,隨著計(jì)算機(jī)被關(guān)掉,兩個(gè)家伙的進(jìn)程也都退出了。半夜無(wú)人之際,硬盤(pán)中這兩個(gè)家伙開(kāi)始吵起來(lái)了。“你是怎么回事?我給你發(fā)消息怎么也不回,害得我一連發(fā)了一堆消息,最后把管道塞滿了,我都阻塞了!”,胖子程序氣憤地說(shuō)道?!班?!別提了,主人給我寫(xiě)的程序有bug,今天運(yùn)行的時(shí)候不小心崩潰了,等我再次起來(lái)時(shí),發(fā)現(xiàn)管道不見(jiàn)了,什么情況啊?”,瘦子程序說(shuō)完嘆了一口氣?!澳强隙ú恍?,這匿名管道需要有親緣關(guān)系的進(jìn)程繼承后才能通信,你用別的方式運(yùn)行起來(lái),肯定看不到我創(chuàng)建的管道??!”“這匿名管道用起來(lái)太麻煩了,看看還有沒(méi)有別的通信方式?”胖子程序又掏出了手冊(cè),翻了起來(lái)。

消息隊(duì)列

“有了有了,這里還寫(xiě)了兩種方式:命名管道、消息隊(duì)列”,胖子程序說(shuō)到?!懊艿??跟匿名管道有什么區(qū)別嗎?”“命名管道有名字,有了名字就不限有親緣關(guān)系的進(jìn)程才能通信了,只要使用這個(gè)名字,都能打開(kāi)管道通信,這下你就算掛了重啟也能跟我聯(lián)系上了”“那消息隊(duì)列又是什么東西?”“額,讓我看一下”“給我也看看”,瘦子程序湊了上去,一起看了起來(lái)。

過(guò)了一會(huì)兒,瘦子程序說(shuō)道:“我看明白了,這消息隊(duì)列是內(nèi)核中的一個(gè)消息鏈表,按照消息塊組織,比那管道全是二進(jìn)制數(shù)據(jù)流堆積在一起好用多了”“有道理,而且這消息還可以指定類(lèi)型,這樣咱們倆就不用弄兩個(gè)管道,一個(gè)消息隊(duì)列就行了,咱們倆使用不同的消息類(lèi)型,可省了不少事兒啊!”“那咱們就用消息隊(duì)列吧,別用那什么管道了”“好,就這么干!”兩個(gè)家伙一拍即合,準(zhǔn)備第二天再大干一場(chǎng)。第二天,計(jì)算機(jī)啟動(dòng)后,它們又偷偷的運(yùn)行了起來(lái)。這一次用上了消息隊(duì)列,聯(lián)絡(luò)起來(lái)方便了不少。

共享內(nèi)存

不知過(guò)了多久,那瘦子進(jìn)程總算來(lái)信兒了,胖子從消息隊(duì)列中取出一看,只見(jiàn)上面寫(xiě)著:

“老大,我拿到了數(shù)據(jù)了,需要你來(lái)處理一下,不過(guò)這數(shù)據(jù)體量有點(diǎn)大,用管道和消息隊(duì)列傳輸效率都太低了,有無(wú)辦法快速把數(shù)據(jù)傳送給你,盼速回。”

胖子進(jìn)程心里一陣歡喜,數(shù)據(jù)拿到了,總算可以回去交差了。不過(guò)怎么樣快速把數(shù)據(jù)傳送過(guò)來(lái)呢,心里又犯起了嘀咕。此時(shí),胖子進(jìn)程又一次拿出手冊(cè),翻到了最后一頁(yè),發(fā)現(xiàn)了一個(gè)叫“共享內(nèi)存”的東西,仿佛像抓住了救命稻草一般,仔細(xì)研究了起來(lái)。片刻之后,胖子的臉上露出了笑容,隨后寫(xiě)下了一條消息給瘦子進(jìn)程發(fā)送了過(guò)去。卻說(shuō)這瘦子進(jìn)程正在焦急等待消息中,收到老大的回信后,趕緊取出來(lái)看:

二弟,主人的手冊(cè)中提到,可以使用共享內(nèi)存進(jìn)行進(jìn)程間通信。我準(zhǔn)備了幾個(gè)內(nèi)存頁(yè)面,你將它們映射到你的進(jìn)程地址空間中,咱們就能共享這一片內(nèi)存,你寫(xiě)的數(shù)據(jù)我能立即看到,我寫(xiě)的你也能立即看到,雖然咱們各自讀寫(xiě)的地址不同,但實(shí)際上是訪問(wèn)的同一片物理內(nèi)存頁(yè)面,比管道和消息隊(duì)列效率高多了!

不過(guò)為了防止咱們一起讀寫(xiě)發(fā)生沖突,需要配合信號(hào)量一起使用,用它來(lái)實(shí)現(xiàn)進(jìn)程間同步。具體的使用方法如下:············盼速回!

瘦子進(jìn)程看完,心中大喜!趕緊通過(guò)消息隊(duì)列發(fā)了一封回信。隨后,通過(guò)老大交代的方法開(kāi)始操作起來(lái),打開(kāi)共享、映射掛載一氣呵成。再接著,將數(shù)據(jù)一股腦兒寫(xiě)到了共享的內(nèi)存頁(yè)面中。大功告成之后,便退出了進(jìn)程,按照計(jì)劃準(zhǔn)備撤退,卻不見(jiàn)了胖子的蹤跡,既無(wú)進(jìn)程也無(wú)文件?!斑@家伙難道拋下我一個(gè)人跑了?”正想著,突然“嗡”的一聲,瘦子的程序文件也沒(méi)了。卻看那文件目錄之下,只留了一卷《Linux進(jìn)程間通信手冊(cè)》···

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6049

    瀏覽量

    136225
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11329

    瀏覽量

    209971
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9256

    瀏覽量

    85765
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3042

    瀏覽量

    74180

原文標(biāo)題:就很突然,電腦里多出了一個(gè)文件......

文章出處:【微信號(hào):sztonyu,微信公眾號(hào):深圳東裕光大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深入解析Linux程序與進(jìn)程

    什么是程序 一組計(jì)算機(jī)能識(shí)別和執(zhí)行的指令,用于指導(dǎo)計(jì)算機(jī)執(zhí)行特定任務(wù)或解決特定問(wèn)題。程序通常由代碼、數(shù)據(jù)和資源文件組成,涉及語(yǔ)法、算法和數(shù)據(jù)結(jié)構(gòu)。為二進(jìn)制文件 什么是進(jìn)程 是一個(gè)具有獨(dú)立功能的程序
    的頭像 發(fā)表于 12-18 11:01 ?119次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進(jìn)程</b>

    深入Linux進(jìn)程管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    基本概述 2.進(jìn)程狀態(tài) 3.進(jìn)程優(yōu)先級(jí) 4.進(jìn)程命令 5. 控制作業(yè) 6.進(jìn)程通信 7.使用信
    的頭像 發(fā)表于 11-22 11:05 ?314次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    一文搞懂Linux進(jìn)程的睡眠和喚醒

    ): 進(jìn)程在等待某個(gè)條件滿足(如I/O操作),可以被信號(hào)喚醒。 Linux通過(guò)內(nèi)核提供的系統(tǒng)調(diào)用來(lái)控制進(jìn)程的睡眠。常用的系統(tǒng)調(diào)用有: sleep(): 使進(jìn)程暫停指定的秒數(shù)。 usl
    發(fā)表于 11-04 15:15

    Linux網(wǎng)絡(luò)基礎(chǔ)知識(shí)總結(jié)

    同 CPU、內(nèi)存以及 I/O 一樣,網(wǎng)絡(luò)也是 Linux 系統(tǒng)最核心的功能。 網(wǎng)絡(luò)是一種把不同計(jì)算機(jī)或網(wǎng)絡(luò)設(shè)備連接到一起的技術(shù),它本質(zhì)上是一種進(jìn)程通信方式,特別是跨系統(tǒng)的
    的頭像 發(fā)表于 10-28 10:42 ?276次閱讀
    <b class='flag-5'>Linux</b>網(wǎng)絡(luò)基礎(chǔ)知識(shí)總結(jié)

    Linux用戶身份與進(jìn)程權(quán)限詳解

    在學(xué)習(xí) Linux 系統(tǒng)權(quán)限相關(guān)的主題時(shí),我們首先關(guān)注的基本都是文件的 ugo 權(quán)限。ugo 權(quán)限信息是文件的屬性,它指明了用戶與文件之間的關(guān)系。但是真正操作文件的卻是進(jìn)程,也就是說(shuō)用戶所擁有的文件
    的頭像 發(fā)表于 10-23 11:41 ?400次閱讀
    <b class='flag-5'>Linux</b>用戶身份與<b class='flag-5'>進(jìn)程</b>權(quán)限詳解

    深入探討Linux進(jìn)程調(diào)度器

    Linux操作系統(tǒng)作為一個(gè)開(kāi)源且廣泛應(yīng)用的操作系統(tǒng),其內(nèi)核設(shè)計(jì)包含了許多核心功能,而進(jìn)程調(diào)度器(Scheduler)就是其中一個(gè)至關(guān)重要的模塊。進(jìn)程調(diào)度器負(fù)責(zé)決定在任何給定的時(shí)刻哪個(gè)進(jìn)程
    的頭像 發(fā)表于 08-13 13:36 ?970次閱讀
    深入探討<b class='flag-5'>Linux</b>的<b class='flag-5'>進(jìn)程</b>調(diào)度器

    工業(yè)控制設(shè)備主要有哪些有線通信技術(shù)?

    ? ? ? 工業(yè)控制設(shè)備的有線通信技術(shù)是實(shí)現(xiàn)工業(yè)自動(dòng)化和智能制造的關(guān)鍵技術(shù)之一。隨著工業(yè)4.0和智能制造的快速發(fā)展,工業(yè)控制設(shè)備通信技術(shù)也在不斷地更新和升級(jí)。以下是對(duì)工業(yè)控制設(shè)備
    的頭像 發(fā)表于 06-23 16:38 ?925次閱讀

    鴻蒙開(kāi)發(fā)通信與連接:ohos.rpc RPC通信

    本模塊提供進(jìn)程通信能力,包括設(shè)備內(nèi)的進(jìn)程通信(IPC)和設(shè)備
    的頭像 發(fā)表于 06-21 09:40 ?574次閱讀
    鴻蒙開(kāi)發(fā)<b class='flag-5'>通信</b>與連接:ohos.rpc RPC<b class='flag-5'>通信</b>

    進(jìn)程通信的消息隊(duì)列介紹

    消息隊(duì)列是一種非常常見(jiàn)的進(jìn)程通信方式。
    的頭像 發(fā)表于 04-08 17:27 ?325次閱讀

    linux下查詢進(jìn)程占用的內(nèi)存方法有哪些?

    linux下查詢進(jìn)程占用的內(nèi)存方法
    發(fā)表于 04-08 06:03

    進(jìn)程通信的信號(hào)問(wèn)題分析

    Linux里面信號(hào)有60多個(gè),分為標(biāo)準(zhǔn)信號(hào)和實(shí)時(shí)信號(hào),編號(hào)從1到31,34到64。不同的內(nèi)核版本略有區(qū)別。
    的頭像 發(fā)表于 04-07 10:16 ?430次閱讀

    linux管道概述

    一、進(jìn)程通信(IPC)介紹 進(jìn)程通信(IPC,I
    的頭像 發(fā)表于 02-18 14:51 ?520次閱讀
    <b class='flag-5'>linux</b>管道概述

    鴻蒙OS跨進(jìn)程IPC與RPC通信

    通過(guò)此代理讀寫(xiě)數(shù)據(jù)來(lái)實(shí)現(xiàn)進(jìn)程的數(shù)據(jù)通信,更具體的講,首先請(qǐng)求服務(wù)的(Client)一端會(huì)建立一個(gè)服務(wù)提供端(Server)的代理對(duì)象,這個(gè)代理對(duì)象具備和服務(wù)提供端(Server)一樣的功能,若想訪問(wèn)
    發(fā)表于 02-17 14:20

    HarmonyOS跨進(jìn)程通信—IPC與RPC通信開(kāi)發(fā)

    一、IPC與RPC通信概述 基本概念 IPC(Inter-Process Communication)與RPC(Remote Procedure Call)用于實(shí)現(xiàn)跨進(jìn)程通信,不同的是前者
    的頭像 發(fā)表于 02-02 17:47 ?1322次閱讀
    HarmonyOS跨<b class='flag-5'>進(jìn)程</b><b class='flag-5'>通信</b>—IPC與RPC<b class='flag-5'>通信</b>開(kāi)發(fā)

    淺談Linux進(jìn)程

    進(jìn)程和程序的區(qū)別: 進(jìn)程是動(dòng)態(tài)的,程序是靜態(tài)的 一、進(jìn)程的創(chuàng)建(fork()函數(shù)) int main(){ pid_t pid; pid=fork(); if(pid?????>0
    的頭像 發(fā)表于 01-28 15:54 ?274次閱讀
    淺談<b class='flag-5'>Linux</b>的<b class='flag-5'>進(jìn)程</b>