Linux進程間通信的socketpair()函數

2020-12-13 閒聊代碼

Linux的socketpair()函數,是創建一對互相連接著的socket描述符。

類似TCP連接,兩個文件描述符都可以讀寫,sv[0]寫入的數據在sv[1]讀出,sv[1]寫入的數據在sv[0]讀出。

它的參數與socket()類似,只是多了一個int sv[2]項用於返回這兩個文件描述符,返回值用於提示創建是否成功。

而socket()函數的返回值就是文件描述符,用返回-1提示失敗。

上圖為它的man手冊。

文件描述符,屬於進程的資源之一,與進程的變量、代碼類似,都會在fork()時被父子進程共享。

所以,socketpair()這個函數就被master+worker型的多進程伺服器廣泛用於master和各個worker的通信。

也可以用於子進程間的通信,因為第二個子進程被fork()時一樣要共享父進程的socketpair,只要子進程間規定好誰使用1,誰使用2就行。

文件描述符在內核裡對應著struct file結構,文件讀寫API最終都要處理內核的文件管理結構,文件描述符是這個結構的代號

只要把某個文件的管理結構映射到某幾個進程,他們就可以共享同一個文件了,在程序裡的表現就是他們共享了同一對socketpair。

具體用法見如下三張圖:

1,首先包含頭文件「sys/types.h」和「sys/socket.h」,

2,然後在main()函數裡先創建socketpair,然後再fork()子進程,這樣子進程就共享了父進程的socketpair,

3,根據fork的返回值去判斷出錯、子進程、還是父進程,然後寫不同的執行代碼。

因為是進程間通信,所以使用AF_UNIX域(domain)的socket,類型選擇SOCK_STREAM,類似TCP的可靠連結。

不要選SOCK_DGRAM,類似udp會在傳輸時丟包的。

我們在父進程裡fork了第二個子進程,讓這兩個子進程互相通信,一個使用sv[1]發送,一個使用sv[0]接收。

他們把各自不用的那個sv[i]關掉,只保留用的那個。

發送字符串時帶著結尾的』\0』,6個字符,因為strlen不計算結尾的』\0』,所以發送長度要加1。

這裡發送數據使用了socket的send()和recv()函數,阻塞式調用。

他們也可以配合epoll()機制進行非阻塞式的調用,是nginx伺服器的底層基礎。

運行結果圖:

PS:一個進程也可以在AF_UNIX域的socket上顯式監聽一個字符串表示的文件目錄,等待其他進程去連接它,類似監聽tcp的socket一樣。

AF_UNIX的socketpair還可以把一個進程打開的文件,傳遞給另一個進程,這叫傳遞socket的附加數據,具體用法可以man一下cmsg。在Linux內核裡就是把這個文件的管理結構struct file的指針加到目標進程的文件列表裡。

相關焦點

  • Linux C Socket Api詳解
    而且網絡通信還是很常用的通信手段。UNIX 環境高級編程對Socket通信的描述是套接字網絡IPC(進程間通信),可以用於計算機間通信也可用於計算機內通信,管道、消息隊列、信號量以及共享內存等都是屬於計算機內通信的情況。一、 套接字Api詳細介紹1. 套接字描述符首先會先到的是文件描述符,對Linux一切皆文件的哲學又多懂了一點兒點兒。
  • 進程間通信方式有哪些?
    前言進程能夠單獨運行並且完成一些任務,但是也經常免不了和其他進程傳輸數據或互相通知消息,即需要進行通信,本文將簡單介紹一些進程之間相互通信的技術--進程間通信(InterProcess Communication,IPC)。由於篇幅有限,本文不會對每一種進行詳細介紹。
  • 超詳細的Socket通信原理和實例講解
    我們深諳信息交流的價值,那網絡中進程之間如何通信,如我們每天打開瀏覽器瀏覽網頁時,瀏覽器的進程怎麼與web伺服器通信的?當你用QQ聊天時,QQ進程怎麼與伺服器或你好友所在的QQ進程通信?這些都得靠socket?那什麼是socket?socket的類型有哪些?還有socket的基本函數,這些都是本文想介紹的。
  • 基於Socket的java通信編程詳解
    Socket原理機制:  通信的兩端都有Socket  網絡通信其實就是Socket間的通信  數據在兩個Socket間通過IO傳輸  7、Java中的網絡支持  針對網絡通信的不同層次,Java提供了不同的API,其提供的網絡功能有四大類:  InetAddress:用於標識網絡上的硬體資源
  • Windows編程技術:Socket通信(上)
    這裡介紹Socket的TCP和UDP通信;一、TCP通信1、函數介紹1.1、socket()函數int socket(int domain, int type, int protocol);socket函數的三個參數分別為: domain:即協議域,又稱為協議族(family)。
  • Linux 下的進程間通信:共享存儲 | Linux 中國
    (之前推送的本篇中代碼存在一些錯誤,重新推送一遍)本篇是 Linux 下進程間通信(IPC)系列的第一篇文章。這個系列將使用 C 語言代碼示例來闡明以下 IPC 機制:在聚焦上面提到的共享文件和共享內存這兩個機制之前,這篇文章將帶你回顧一些核心的概念。
  • Python網絡編程socket模塊實例解析
    socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉)。(1)利用socket進行簡單的連結Python裡面的socket支持UDP、TCP、以及進程間的通信,socket可以把我們想要發送的東西封裝起來,發送過去,然後反解成原來的樣子,事實上網路通信可以理解成都是建立在socket之上,下面的代碼是演示利用socket進行簡單的連結#要成一次通信,至少要有兩個人,也就是一個服務端
  • PHP SOCKET編程
    特別是php的socket擴展庫可以做的事情簡直不會比c差多少。php的socket連接函數1、集成於內核的socket這個系列的函數僅僅只能做主動連接無法實現埠監聽相關的功能。而且在4.3.0之前所有socket連接只能工作在阻塞模式下。
  • PHP多進程抓取網頁
    我們知道,從父進程到子經常的數據傳遞相對比較容易一些,但是從子進程傳遞到父進程就比較的困難。
  • Linux的分離聚合IO函數(scatter/gather)
    系統調用多了也會降低效率,每一次系統調用都會進入內核,除了需要的功能之外還會經過一大堆的檢測(例如是否存在段錯誤),甚至進程切換。在通過Linux的系統調用讀寫數據時,經常面臨的情況是,要麼多一次系統調用,要麼多複製一次數據。
  • Linux C語言高級編程之Socket網絡編程!
    基於socket的一對一通信模型1、服務端:1)創建socket,使用socket函數;2)準備通信地址,使用結構體類型;3)綁定socket和通信地址,使用bind函數;4)進行通信,使用read/write函數;
  • too many open files 與進程網絡連接數據查看
    5 加載linux 的函數庫文件【當然它會加載所有引入的函數庫,只能只截圖一張】你可以清晰的看到它會讀取elf文件,因為函數庫即.so它也是elf文件的一種。6 redis 進程關係7 啟動服務後,進程創建/打開了哪些文件【在linux中不管管道文件,socket文件,目錄,epoll函數創建的句柄他們都稱為文件】
  • Socket網絡編程核心API深入分析(一):bind函數
    注意:本片文章涉及到的內核源碼來自linux內核版本3.6簡單的伺服器與客戶端實現本篇文章的重點在於從底層深入分析bind()函數,相信已經能夠自己實現一個簡單的伺服器和客戶端並進行交互,下面是一個簡單的demo,幫助大家複習一下socket編程api的調用過程。
  • python socket編程的理解
    編寫server的步驟第一步創建socket對象。調用socket構造函數。如:socket = socket.socket( family, type )family參數代表地址家族,可為AF_INET或AF_UNIX。
  • Python Socket 編程學習筆記
    埠:光有IP位址是不夠的,埠是識別一個IP位址下的具體進程,比如,web服務的標準埠是80,SMTP是25,FTP是21。埠號小於1024的是internet標準服務的埠,大於1024的可以任意使用。
  • Python基於Socket實現群聊
    作者:hunyhttps://www.cnblogs.com/huny/p/14051152.html套接字(Sockets)是雙向通信信道的端點
  • 如何利用socket進行通信?
    (感興趣可以自己去看網上的網際網路協議講解)網際網路之所以可以進行通信(發送數據和接收數據),是因為它根據網絡協議已經實現了對應的接口,可以讓我們通過接口來發送數據和接收數據。什麼是socket在python中要相互通信,可以使用socket這個模塊來實現,socket是對TCP/IP協議的封裝,socket本身並不是協議,而是一個調用接口(API),通過socket,我們才能使用TCP/IP協議來發送數據和接收數據。
  • Windows編程技術:Socket通信(下)
    由於UDP是一種無連接傳輸方式,所以支持一對一、一對多、多對一和多對多的交互通信。參數說明:s: socket描述符;  buf: UDP數據報緩存區(包含待發送數據);  len: UDP數據報的長度;  flags:調用方式標誌位(一般設置為0);  to:  指向接收數據的主機地址信息的結構體(sockaddr_in需類型轉換);  tolen:to所指結構體的長度;1.2 recvfrom()int
  • python socket實戰(二)
    在真正的項目工程中,如果是涉及到底層到消息交互,譬如和硬體設備通信,都會自定義協商好交互到消息頭欄位。這個在c語言編程中尤為常見。例如,有一個如下到結構體,python如何用socket進行通信傳遞該消息呢。