月黑風高夜,突然聽得咣當一聲,Web服務器的目錄下冒出了兩個檔案,弄出了不小的聲響,這兩個家伙一胖一瘦,鬼鬼祟祟,潛入這臺計算機,不知要搞什么名堂,
“二弟,一會兒咱們按照計劃好的運行起來,分頭行事,你等我信號,拿到資料后趕緊撤”,胖子對瘦子說到,
“老大,這地方我不熟悉,我怎么等你信號?咱們得想個聯系方式,一會兒通信使用”,瘦子說到,
“這個不用擔心,主人都交代好了”,胖子一邊說,一邊從背后拿出一本 《Linux行程間通信手冊》 翻了起來,
信號
翻開手冊的第一頁,上面寫著:信號——Signal,兩個家伙開始認真研究起來,
片刻之后,胖子程式說道:“唉,這個不行,往后翻吧!”
瘦子程式不解,問道:“咋就不行啦?”
“你看這里,手冊上說了,信號是Linux上的一種軟中斷通信機制,可以向指定行程發送通知,總共有64種信號,不過這個信號只能作為通知使用,沒辦法傳輸資料”

“沒法傳輸資料?那這玩意有什么用?”
“還是有用啊,可以通知某個行程發生了什么事件,比如kill命令就是利用這個信號來告知行程退出從而實作殺行程的效果的”
“原來如此”,瘦子程式若有所思的點了點頭,此時胖子已經翻到了手冊的第二頁,
socket
“你看,手冊上寫了,可以用socket”,胖子說到,
“socket?那不是網路通信使用的嗎?”,瘦子有些疑惑,
“是啊,不過咱們一樣可以用來在本地計算機通信,把連接的IP地址換成127.0.0.1就行了”
“感覺有點太招搖了,咱們計算機內部行程通信,資料還要經過網卡,很容易被發現的!”
“不會不會,手冊上說了,127.0.0.1是本地回環地址,資料在協議堆疊就進行轉發了,根本不會到達網卡”

“那抓包能抓到咱們通信嗎?”
“嗯,讓我看看···手冊上說,可以在虛擬的回環網卡lo上抓到資料”
“還是算了吧,咱干這事得悄悄進行,不能留下痕跡,你再看看還有沒有別的招”
聽瘦子這么一說,胖子倒也覺得有理,便在手冊上繼續翻了起來,
匿名管道
“哎,有了有了,這個叫匿名管道的,聽起來就比較隱秘,應該不會被發現,”
瘦子接過手冊,看了起來,
這倆盯著手冊上的兩個圖研究了半天,總算弄明白了,所謂匿名管道不過是內核中的一段緩沖區,提供了讀寫兩個口子,通過fork創建子行程后,子行程繼承了父行程的管道資訊,兩邊只要約定好,一個讀,一個寫,就能實作通信了,


“老大,這匿名管道是單向的,咱們要通信,得整兩根管道才行,一個你寫我讀,一個我寫你讀”
“看起來挺靠譜,就這么干!”,二人達成了一致,
胖子程式率先運行起來,隨后創建了兩個管道,一個用來發送訊息,一個用來接收訊息,接著執行fork,將瘦子程式也運行了起來,

時間過的很快,轉眼已是深夜,隨著計算機被關掉,兩個家伙的行程也都退出了,
半夜無人之際,硬碟中這兩個家伙開始吵起來了,
“你是怎么回事?我給你發訊息怎么也不回,害得我一連發了一堆訊息,最后把管道塞滿了,我都阻塞了!”,胖子程式氣憤地說道,
“嗨!別提了,主人給我寫的程式有bug,今天運行的時候不小心崩潰了,等我再次起來時,發現管道不見了,什么情況啊?”,瘦子程式說完嘆了一口氣,
“那肯定不行,這匿名管道需要有親緣關系的行程繼承后才能通信,你用別的方式運行起來,肯定看不到我創建的管道啊!”
“這匿名管道用起來太麻煩了,看看還有沒有別的通信方式?”
胖子程式又掏出了手冊,翻了起來,
訊息佇列
“有了有了,這里還寫了兩種方式:命名管道、訊息佇列”,胖子程式說到,
“命名管道?跟匿名管道有什么區別嗎?”
“命名管道有名字,有了名字就不限有親緣關系的行程才能通信了,只要使用這個名字,都能打開管道通信,這下你就算掛了重啟也能跟我聯系上了”
“那訊息佇列又是什么東西?”
“額,讓我看一下”
“給我也看看”,瘦子程式湊了上去,一起看了起來,

過了一會兒,瘦子程式說道:“我看明白了,這訊息佇列是內核中的一個訊息鏈表,按照訊息塊組織,比那管道全是二進制資料流堆積在一起好用多了”
“有道理,而且這訊息還可以指定型別,這樣咱們倆就不用弄兩個管道,一個訊息佇列就行了,咱們倆使用不同的訊息型別,可省了不少事兒啊!”
“那咱們就用訊息佇列吧,別用那什么管道了”
“好,就這么干!”
兩個家伙一拍即合,準備第二天再大干一場,
第二天,計算機啟動后,它們又偷偷的運行了起來,
這一次用上了訊息佇列,聯絡起來方便了不少,
共享記憶體
不知過了多久,那瘦子行程總算來信兒了,胖子從訊息佇列中取出一看,只見上面寫著:
“老大,我拿到了資料了,需要你來處理一下,不過這資料體量有點大,用管道和訊息佇列傳輸效率都太低了,有無辦法快速把資料傳送給你,盼速回,”
胖子行程心里一陣歡喜,資料拿到了,總算可以回去交差了,不過怎么樣快速把資料傳送過來呢,心里又犯起了嘀咕,
此時,胖子行程又一次拿出手冊,翻到了最后一頁,發現了一個叫“共享記憶體”的東西,仿佛像抓住了救命稻草一般,仔細研究了起來,
片刻之后,胖子的臉上露出了笑容,隨后寫下了一條訊息給瘦子行程發送了過去,
卻說這瘦子行程正在焦急等待訊息中,收到老大的回信后,趕緊取出來看:
二弟,主人的手冊中提到,可以使用共享記憶體進行行程間通信,
我準備了幾個記憶體頁面,你將它們映射到你的行程地址空間中,咱們就能共享這一片記憶體,你寫的資料我能立即看到,我寫的你也能立即看到,雖然咱們各自讀寫的地址不同,但實際上是訪問的同一片物理記憶體頁面,比管道和訊息佇列效率高多了!
不過為了防止咱們一起讀寫發生沖突,需要配合信號量一起使用,用它來實作行程間同步,
具體的使用方法如下:
······
······
盼速回!
瘦子行程看完,心中大喜!趕緊通過訊息佇列發了一封回信,
隨后,通過老大交代的方法開始操作起來,打開共享、映射掛載一氣呵成,再接著,將資料一股腦兒寫到了共享的記憶體頁面中,
大功告成之后,便退出了行程,按照計劃準備撤退,卻不見了胖子的蹤跡,既無行程也無檔案,
“這家伙難道拋下我一個人跑了?”
正想著,突然“嗡”的一聲,瘦子的程式檔案也沒了,
卻看那檔案目錄之下,只留了一卷《Linux行程間通信手冊》···
相關推薦
一個故事看懂Redis
一個故事看懂Docker
一個故事看懂CPU中斷技術
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291239.html
標籤:其他
上一篇:C語言之volatile關鍵字
下一篇:函式遞回講解

