1.進程間通信
問題:每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個近程中都看不到。
解決方案:進程之間要交換數據必須通過內核,因此在內核中開辟一塊緩沖區,進程1把數據從用戶空間拷到內核緩沖區,進程2再從內核緩沖區把數據讀走。
內核提供的這種機制稱為進程間通信(IPC ,Inter Process Communication).
本質:讓不同的進程看到一份公共的資源,這份資源由內核提供。
2.管道(pipe)管道是一種最基本的IPC機制,具有以下特征:
1. 只能進行單向通信;
2. 只適合於有血緣關系之間的進程通信;
3. 通信時,寫端寫一條,讀端讀一條,自帶同步機制;
4. 通信時是面向字節流的服務;
5. 當與之相關的進程退出時,管道也隨之關閉。這說明管道的生命周期隨進程。
2.1 管道的創建
由pipe函數創建#include
int pipe(int filedes[2]);
該函數創建的管道的兩端處於一個進程中間,在實際應用中沒有太大意義,因此,一個進程在由pipe()創建管道后,一般再fork一個子進程,然后通過管道實現父子進程間的通信(因此也不難推出,只要兩個進程中存在親緣關系,這里的親緣關系指的是具有共同的祖先,都可以采用管道方式來進行通信)。
2.2 管道間的通信
1.父進程調用pipe開辟管道,得到兩個文件描述符指向管道的兩段;
2.父進程調用fork創建子進程,那么子進程也有兩個文件描述符指向同一管道;