?

Linux下進程間通信機制的探討許豪

2016-03-15 09:15陳可
科技與創新 2016年3期
關鍵詞:信號

陳可

摘 要:簡單介紹了Linux下的進程間通信機制,包括信號、管道、信號量、共享內存、消息隊列,重點分析了信號和管道通信機制,包括信號通信機制的本質、信號通信機制在代碼中的實現、利用信號傳遞數據的具體方法。此外,還總結了管道通信機制、信號量通信機制、消息隊列通信機制、共享內存通信機制的特點、實現過程及其在編程過程中應重點關注的問題。

關鍵詞:進程間通信;信號;信號量;通信機制

中圖分類號:TP316.81 文獻標識碼:A DOI:10.15913/j.cnki.kjycx.2016.03.083

本文主要介紹了Linux下進程間通信機制的發展歷史、分類以及每一種進程間通信機制的特點、適用場景等。從單個操作系統的內部看,Linux下的進程間通信機制有信號、管道、信號量、共享內存、消息隊列。在以上進程間通信機制中,信號和管道是最古老的進程間通信機制。這兩種進程間通信機制是Linux操作系統直接從UNIX操作系統繼承過來的。

1 信號通信機制

信號通信機制比較特殊,類似于異步軟中斷。如果兩個進程利用信號通信,則必須具備1個信號發送進程和1個信號接收進程。

可以調用kill函數和sigqueue函數完成信號的發送,并可在2個函數中分別指定信號發送至哪個進程、被發送信號的值。如果需要隨信號發送一些附加信息給信號接收程序,則只能采用sigqueue函數完成該操作。此時,會將附加信息存儲在sigqueue函數的第三個參數中,該參數中的信息會隨著信號一起發送至信號接收進程。

接收信號進程需要調用signal函數或sigaction函數來安裝信號,即規定當前進程接收到信號后去完成怎樣的任務。通常情況下,這些任務會封裝在1個函數中。如果接收進程通過signal函數安裝信號,則接收進程無法接收隨著信號傳遞而來的附加信息。如果需要接收隨著信號傳遞而來的附加信息,則需要調用sigaction函數完成信號的安裝。接收信號進程一旦接收到信號后,就會調用與該信號相關的函數,并執行該函數內部的代碼;函數代碼執行完畢后,當前進程返回到原程序繼續執行。該過程類似于當前進程陷入到一次中斷,中斷完畢后又恢復執行的過程。

2 管道通信機制

管道通信機制又分為有名管道和匿名管道(無名管道)。有名管道相當于文件系統的文件之一,有正式的文件名稱,可通過ls命令在文件系統中查看該文件。當兩個進程利用有名管道通信時,可先利用mkfifo函數創建1個有名管道文件,然后在讀、寫進程中分別打開該文件進行讀、寫操作即可。該過程類似于操作普通文件。匿名管道通信機制沒有有名管道通信機制靈活,其僅適用于具有血緣關系的進程間通信,即父子進程、兄弟進程。匿名管道類似于當前進程的資源之一,當前進程結束后,匿名管道會隨之消亡。如果父子進程利用匿名管道通信,則父進程必須在調用fork函數創建子進程前,先調用pipe函數創建匿名管道。此時,子進程才能從父進程繼承同一個匿名管道的相關信息。其中,最重要的部分是匿名管道的讀、寫端口,其文件描述符在pipe函數調用成功后就已生成。讀進程只能通過讀端口文件描述符從管道文件中讀取數據,寫端口只能通過寫端口文件描述符向管道文件中寫入數據。如果操作錯誤,則程序會出錯并返回。

除了管道和信號外,還有信號量、消息隊列和共享內存三種System V進程間通信機制。從代碼層面看,這些進程間通信機制有很多類似之處,但從實現的層面看,三者是有區別的。

3 消息隊列通信機制

消息隊列通信機制一般用于信息量較小的進程間通信。消息隊列通信機制是通過在內存中創建1個隊列來讓2個進程完成通信的。發送消息的進程會先調用msgget函數創建1個消息隊列,然后通過msgsnd函數將消息發送到消息隊列中;接收消息的進程會先調用同樣的函數msgget,但此時msgget函數表示打開現有的消息隊列,接收進程中的msgget函數參數必須與發送進程中的msgget函數參數一致,接收進程打開消息隊列后,會直接調用msgrcv函數,從而從消息隊列中獲取消息。

4 共享內存通信機制

當多個進程需要共享、傳遞大量數據時,往往會采用共享內存通信機制。共享內存是進程間通信機制中效率最高的一種。寫進程時,只需要調用shmget函數創建共享內存,再調用shmat函數將創建的共享內存映射到自身的邏輯地址空間后,相關人員就可直接操作這塊內存區域;讀進程時,其代碼與寫進程代碼類似,但讀進程中shmget函數的參數必須與寫進程中shmget函數中的參數一致。讀、寫進程利用共享內存通信完畢后,需要分別調用shmdt函數,以解除共享內存和各自邏輯地址空間的映射關系。

5 信號量通信機制

信號量通信機制比較特殊,因為進程不能通過信號量傳遞數據,信號量僅能表示當前與該信號量相關資源的數量。通過控制信號量,能控制多個進程的資源共享過程。創建信號量集合可用semget函數,從而可確定信號量集合中信號量的個數;通過semop函數可對信號量進行增加或減少操作,并通過semctl函數可完成對信號量值及其他屬性的操作。

6 結束語

綜上所述,Linux操作系統中的5種進程間通信機制各有特點,在代碼實現的過程中,需要具體問題具體分析。只有這樣,才能提高Linux下進程間通信的效率。

參考文獻

[1]楊宗德.Linux高級程序設計[M].北京:人民郵電出版社,2012.

[2]楊水清.精通ARM嵌入式Linux系統開發[M].北京:電子工業出版社,2012.

〔編輯:張思楠〕

猜你喜歡
信號
肩背痛竟然也是肺癌信號
完形填空二則
大赤魷的圖案信號
等待信號員
民用航空測距信號對北斗導航信號的干擾分析
民用航空測距信號對北斗導航信號的干擾分析
信號
美國信號9防衛公司Reliant四管手槍
高處信號強
播出系統信號源自動切換方案
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合