天天3分鐘操做系統修煉祕籍(17):進程間通訊(3):套接字

套接字

套接字(Socket)用於協調不一樣計算機上的進程間通訊,也就是基於網絡的通訊。固然,也能夠在本機上使用套接字進行進程間的通訊。編程

套接字通訊的方式很是多,有Unix域套接字、TCP套接字、UDP套接字、鏈路層套接字等等。但最經常使用的確定是TCP套接字。因此,這裏介紹下TCP Socket通訊方式,稍後再單獨介紹Unix域套接字。網絡

TCP Socket用於客戶端、服務端的基於TCP協議的通訊,因此在客戶端和服務端均須要建立一個套接字。建立TCP套接字時會返回這個套接字的文件描述符,可經過這個文件描述符對套接字進行讀和寫操做。socket

對比一下,當一個程序須要對一個磁盤文件同時進行讀寫操做(在命令行下彷佛沒有找到這種命令,但經過編程方式是很容易實現的)時,因爲只經過單個文件描述符同時負責讀和寫,極可能須要經過不斷移動文件指針的方式來改變讀寫的位置,不然數據很容易錯亂。操作系統

而TCP套接字也是經過單個文件描述符進行讀寫套接字的,爲了保證讀和寫的位置不錯亂,操做系統在內核空間爲每一個TCP套接字維護了兩個buffer空間,一個buffer用於寫、一個buffer用於讀。提供讀的buffer空間稱爲recv buffer,提供寫的buffer空間稱爲send buffer,它們統稱爲socket buffer命令行

因此,服務端和客戶端經過兩個套接字通訊就簡單了,一端向send buffer寫數據,該buffer的數據會經過已經創建好的TCP鏈接發送到另外一端的recv buffer,因而另外一端只需從recv buffer中讀數據便可實現不一樣計算機上的進程間通訊。過程如圖。unix

Unix域套接字

Unix域套接字是套接字的一種,用於本機進程間通訊,通常用來實現雙向通訊的管道。Unix域套接字是比網絡套接字輕量級且高效的多,由於它不涉及網絡通訊,不須要監聽鏈接,不須要綁定地址,不須要關心協議類型,等等。指針

建立Unix域套接字後返回兩個文件描述符,這兩個文件描述符均對套接字可讀、可寫,從而實現全雙工的雙向通訊。blog

一樣的,爲了不使用單個文件描述符同時讀、寫形成的數據錯亂,Unix域套接字也有兩個buffer空間。進程

相關文章
相關標籤/搜索