linux進程間通信(一)----初識篇

先給自己打個廣告,本人的微信公衆號正式上線了,搜索:張笑生的地盤,主要關注嵌入式軟件開發,股票基金定投,足球等等,希望大家多多關注,有問題可以直接留言給我,一定盡心盡力回答大家的問題
在這裏插入圖片描述
一 前言
因爲本篇是初識linux進程,也就意味着我們目前還不是很瞭解linux進程,所以本文主要以一些通俗易懂的比喻和一些個人淺薄的認識談談linux進程,後續隨着自己知識點的提高,會不定期更新本文。

既然說是初識,那麼我們和linux還不是很熟,想想我們在追女朋友之前,還不瞭解她的話,我們一般會怎麼做(想多了吧,程序員有什麼女朋友,要什麼女朋友,是代碼不好玩,還是bug不夠多,哈哈,開個玩笑)。我想大家無非都是從一些基礎簡單的入手,比如通過身邊人打聽,未來女朋友的作息習慣呀,個人愛好呀,投其所好方能贏得芳心嘛。

ok,如果把linux進程(這裏將進程單獨列出來了)比作女朋友,我們又該如何去了解並逐步深入呢?

  1. 最起碼要知道進程是什麼吧(雖然追女友之前,我們已經知道未來女朋友是誰了,但是沒追之前,你知道你未來女朋友是誰呢?)?
  2. 進程有什麼特點呢(女朋友的作息習慣,或是個人愛好)

二 正篇
1. 進程是什麼?
一上來就以一些專業性的回答來回答,相比初識者會比較迷糊,我們先不以專業性的答案來回答。

試想一個場景,我們剛開始學習C語言編程的場景應該還歷歷在目吧,不管是在window下面編寫運行C程序,還是linux環境下面編寫運行C程序。我們第一個程序是hello world,當我們在寫完第一個hello world並運行之後,實際上在我們的windows/linux環境下面做了什麼呢?是不是運行了一個可執行程序,那麼這個可執行程序在對應的環境下,我們如何稱呼它呢?假設我們寫了好幾個獨立運行的程序,並且同時運行了它們,那麼在對應的環境下面,我們又是該如何稱呼它呢?

-------------------我是分割線,請思考上面兩個場景,再繼續閱讀----------------

我們把上面單獨運行的一個可執行程序稱之爲一個進程,專業話來回答就是進程是一個具有一定獨立功能的程序在一個數據集上的一次動態執行的過程,是操作系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。還是有點不理解這句話對嗎?想想我們學習的第一個C程序 hello world,你是怎麼命名第一個C程序的?main.c,1st_C.c, 還是別的什麼?以linux環境下爲例,如果我們的第一個C程序命名爲1st.c,按照如下編譯運行,那麼first就是linux主機下面的一個進程。

gcc 1st.c -o first
./first

2. 進程有什麼特點呢?
(a)資源的唯一性,不共享性
不同進程之間的資源(全局變量等等)在用戶空間是不能共享的,只能單獨屬於該進程本身,比如同樣以上面的例子爲例,我們學習並寫了兩個程序分別是1st.c和2nd.c,兩者之間無任何關係,分別編譯並且同時運行
對於1st.c

int global = 1;
int main(int argc, char *argv[])
{
    ......
    return 0;
}
gcc 1st.c -o first

對於2nd.c

int global = 2;
int main(int argc, char *argv[])
{
    ......
    return 0;
}
gcc 2nd.c -o second

顯然兩個C程序都有global變量,也就是說兩個進程first和second都有變量global,那麼這兩個進程可以訪問對方的global嗎?顯然我們發現是不可能的,否則的話兩個進程都無法正確工作了,而我們實際同時運行first和second時,兩個線程的工作是正確的。

其實呢,兩個單獨的進程好比兩間房子,這兩間房子沒有窗戶,沒有門,互相都看不到對方里面的東西,所以無法實現通信。這裏稍微引入一下線程的比喻,而線程呢,好比一間房子裏的不同房間,屬於這個房子的客廳,廚房等等,是公共區域,所以不同的線程都能夠看到並使用

(b)一個進程是如何創建的呢
這個就無法舉恰當的例子了,它是調用系統函數fork創建的。但是我想大家都會問我學習的第一個c函數時,並沒有調用fork函數來創建,那麼windows系統是如何幫我們創建的呢?這個需要單獨開一篇文章來講,這裏就不做介紹了。

(c)如果兩個進程之間需要訪問對方的內容,如何實現?
啊哈,終於問到正點了,這是一個很有價值的問題。概括來說,就需要進程間通信了,就是一個進程要把它的內容傳遞給對方,另一個進程要能接受對方傳遞過來的消息。這部分內容是我們學習進程的重點,也是接下來的幾篇文章要探討的內容。

3. 進程間通信原理和示意圖
通過上面的知識,我們知道,在用戶空間,進程是無法通信的(用戶空間是什麼鬼,上面沒有談到這個詞,你突然來了這一句,我表示有點蒙圈,哈哈)

A和B是兩個進程,他們通過操作內核裏的同一個對象實現通信 
      |————|                    |————|
      |  A |                    |  B |
      |————|                    |————|
    ----|--------------------------|-----
        |                          |
        |         |------|         |
內核    |-------->| 對象 |<--------|
                  |------|
    -------------------------------------

進程之間通信的原理都是基於文件讀寫思想,所以因此有open、write、read以及close函數,當然open不是簡單的文件open函數,它有屬於它自己的類似open的函數。

4. 進程間通信方式有哪些呢
以下通信方式都只有一個linux內核,也就是隻在一個設備上(但是這種說法也不完全正確,一個設備上可能存在兩個SoC,分別都跑linux系統)

通信方式 分類
信號通信 信號的發送,信號的接收,以及信號的處理
IPC通信 共享內存,消息隊列以及信號燈
管道通信 無名管道和有名管道
還有一個多linux之間的通信
socket通信:存在於一個網絡中的進程間通信,說白了就是多臺設備時間的進程通信

三 後續
上面介紹了一些linux進程的初級知識,希望大家能夠明白,沒有太多專業的術語,對於linux老手來說,學習到的東西可能不多,請見諒。
接下來的系列文章《linux進程間通信》將分別介紹各種通信方式的基礎知識,文中會穿插一些代碼,希望大家根據代碼在自己本機上實際調試驗證,當然這些代碼都是在linux虛擬機上調試運行的,希望大家也準備好linux虛擬機。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章