管道

  1. 進程通信

    每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到所以進程之間要交換數據必須通過內核,在內核中開闢一塊緩衝區,進程1把數據從用戶空間拷到內核緩衝區,進程2再從內核緩衝區把數據讀走,內核提供的這種機制稱爲進程間通信.

    wKiom1eM1MbizZg6AABLcarfA0Y714.png-wh_50

  2. 匿名管道

    管道是一種最基本的IPC機制,由pipe函數創建:

    #include <unistd.h>

    int pipe(int filedes[2]);

    調用pipe函數時在內核中開闢一塊緩衝區(稱爲管道)用於通信,它有一個讀端一個寫端,然後通過filedes參數傳出給用戶程序兩個文件描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端(很好記,就像0是標準輸入1是標準輸出一樣)。所以管道在用戶程序看起來就像一個打開的文件,通過read(filedes[0]);或者write(filedes[1]);向這個文件讀寫數據其實是在讀寫內核緩衝區。pipe函數調用成功返回0,調用失敗返回-1。wKiom1eM1N-C8seCAAJsqjkWiPw627.png-wh_50

  3. 父進程調用pipe開闢管道,得到兩個文件描述符指向管道的兩端。

  4. 父進程調用fork創建子進程,那麼子進程也有兩個文件描述符指向同一管道。

  5. 父進程關閉管道讀端,子進程關閉管道寫端。父進程可以往管道里寫,子進程可以從管道里讀,管道是用環形隊列實現的,數據從寫端流入從讀端流出,這樣就實現了進程間通信。

  6. 匿名管道特點

  7. (1)只能用於有血緣關係的進程間通信

  8. (2)生命週期隨進程

  9. (3)提供數據間通信方式 ,面向字節流

  10. (4)管道內部實現的進程同步機制

  11. (5)單向數據通信

  12. 使用管道需要注意一下四種特殊情況

  13. (1)如果所有指向管道寫端的文件描述符都關閉了(管道寫端的引用計數爲 0)而任然有進程從管道讀端讀數據,那麼管道中剩下的數據都被讀取以後,再次read會返回0,就像讀到文件末尾一樣

  14. (2)如果有指向管道寫端的文件描述符沒關閉 (管道寫端的文件描述符大於0)而持有管道寫端的進程也沒有向管道中寫入數據,這時有進程從管道讀端讀數據,那麼管道中剩餘的數據都被讀取以後,再次read會阻塞,直到管道中有數據可讀了 纔會讀取數據並返回

  15. (3)如果所有指向管道讀端的文件描述符都關閉了(管道中的引用計數等於0)這時有進程向管道寫端write,那麼該進程會收到信號SIGPIPE通常會導致進程異常終止

  16. (4)如果指向管道讀端的文件描述符沒有關閉(管道讀端的引用計數大於0),而持有管道讀端的進程也沒有從管道中讀數據,這時有進程向管道寫端寫數據,那麼在管道寫滿時再次write會阻塞,直到管道中有了空位置才寫入數據並返回

  17. 命名管道

  18.     管道的一個不足之處是沒有名字,因此只能用於親緣關係的進程間通信,FIFO不同於管道之處在於它提供 一個路徑名與之關聯,以FIFO的形式存儲於文件系統;命名管道是一個設備文件,因此即使進程與創建FIFO的進程間不存在親緣關係,只要可以訪問該路徑,就能通過FIFO相互通信

  19. 1.命名管道的創建與讀寫

  20. Linux下有兩種方式創建命名管道,一是shell下交互的建立命名管道,二是程序中使用系統函數建立命名管道。shell可用mknod ,mkfifo命令,下面使用mknod namedpipe

  21. 創建命名管道的系統函數有兩個:mknod mkfifo兩個函數均定義在頭文件sys/stst.h

  22. 函數原型如下:

  23. #include<sys/types.h>

  24. #include<sys/stst.h>

  25. int mknod(const char* path,mode_t mod,dev_t dev);

  26. int mkfifo(const char* path,mode_t mode);

  27. 函數mknod參數中

  28. path:爲創建的命名管道全路徑名;

  29. mod:創建的命名管道模式,指明其存取權限;

  30. dev:爲設備值,該值取決於文件創建的種類,它只在創建設備文件時纔會  用到;

  31. 這兩個函數調用成功返回0失敗都返回-1

  32. 命名管道創建後就可以使用了,命名管道和管道的使用方法基本相同,使用命名管道時必須將其打開open(),因爲命名管道存在與一個硬盤上的文件,而管道是存在與內存上的特殊文件

管道容量

wKiom1eM2Zfzykv5AACFpU82neU053.png-wh_50

wKioL1eM2ZjBSNHqAABfaDKfZkQ186.png-wh_50



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