久久96国产精品久久久-久久发布国产伦子伦精品-久久精品国产精品青草-久久天天躁夜夜躁狠狠85麻豆

技術員聯盟提供win764位系統下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務器類 >

Linux進程通信(IPC)方式簡介

來源:技術員聯盟┆發布時間:2018-10-19 00:26┆點擊:

  linux下進程間通信的幾種主要方式:管道(pipe)和有名管道(FIFO)、信號(signal)、消息隊列、共享內存(shared memory)、信號量(semaphore)、套接字(socket),本文對這些做簡單介紹

  進程間通信的目的

  數據傳輸:一個進程需要將它的數據發送給另一個進程,發送的數據量在一個字節到幾兆字節之間。

  共享數據:多個進程想要操作共享數據,一個進程對共享數據的修改,別的進程應該立刻看到。

  通知事件:一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。

  資源共享:多個進程之間共享同樣的資源。為了作到這一點,需要內核提供鎖和同步機制。

  進程控制:有些進程希望完全控制另一個進程的執行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,并能夠及時知道它的狀態改變。

  進程通信方式

  linux下進程間通信的幾種主要方式:

  (1)管道(pipe)和有名管道(FIFO)

  (2)信號(signal)

  (3)消息隊列

  (4)共享內存(shared memory)

  (5)信號量(semaphore)

  (6)套接字(socket)

  管道

  管道(pipe)及有名管道(named pipe):管道可用于具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信。

  管道是單向的、先進先出的、無結構的、固定大小的字節流,它把一個進程的標準輸出和另一個進程的標準輸入連接在一起。寫進程在管道的尾端寫入數據,讀進程在管道的首端讀出數據。數據讀出后將從管道中移走,其它讀進程都不能再讀到這些數據。管道提供了簡單的流控制機制。進程試圖讀空管道時,在有數據寫入管道前,進程將一直阻塞。同樣,管道已經滿時,進程再試圖寫管道,在其它進程從管道中移走數據之前,寫進程將一直阻塞。通常有種限制,一是半雙工,只能單向傳輸;二是只能在父子進程間使用。

  有名管道(也叫FIFO,因為管道工作在先入先出的原則下,第一個寫入管道的數據也是第一個被讀出的數據)。與管道不同,FIFO不是臨時的對象,它們是文件系統中真正的實體,可以用mkfifo命令創建。只要有合適的訪問權限,進程就可以使用FIFO。FIFO的打開方式和管道稍微不同。一個管道(它的兩個file數據結構、VFS I節點和共享數據頁)是一次性創建的,而FIFO已經存在,可以由它的用戶打開和關閉。Linux必須處理在寫進程打開FIFO之前讀進程對它的打開,也必須處理在寫進程寫數據之前讀進程對管道的讀。除此以外,FIFO幾乎和管道的處理完全一樣,而且它們使用一樣的數據結構和操作。

  信號

  信號(signal):信號是比較復雜的通信方式,用于通知接受進程有某種事件發生,除了用于進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基于BSD的,BSD為了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數)。

  信號是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式。

  信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發生了哪些系統事件。它可以在任何時候發給某一進程,而無需知道該進程的狀態。

  如果該進程當前并未處于執行態,則該信號就由內核保存起來,直到該進程恢復執行再傳遞給它;如果一個信號被進程設置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消時才被傳遞給進程 。

  進程執行信號的方式:

  忽略信號,即對信號不做任何處理,其中,有兩個信號不能忽略:SIGKILL及SIGSTOP。

  捕捉信號,定義信號處理函數,當信號發生時,執行相應的處理函數。

  執行缺省操作,Linux對每種信號都規定了默認操作。

  消息隊列

  消息隊列:消息隊列是消息的鏈接表,包括Posix消息隊列System V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受限等缺點。

  消息隊列的實現包括創建或打開消息隊列、添加消息、讀取消息和控制消息隊列這四種操作:

  創建或打開消息隊列使用的函數是msgget,這里創建的消息隊列的數量會受到系統消息隊列數量的限制。

  添加消息使用的函數是msgsnd函數,它把消息添加到已打開的消息隊列末尾。

  讀取消息使用的函數是msgrcv,它把消息從消息隊列中取走,與FIFO不同的是,這里可以指定取走某一條消息。

  控制消息隊列使用的函數是msgctl,它可以完成多項功能。

  信號量/信號燈