當前位置:首頁 » 操作系統 » 消息隊列linux

消息隊列linux

發布時間: 2023-08-19 09:29:34

linux 進程間通信方式有哪些

進程間通信(IPC,Interprocess
communication)是一組編程介面,讓程序員能夠協調不同的進程,使之能在一個操作系統里同時運行,並相互傳遞、交換信息。這使得一個程序能夠在同一時間里處理許多用戶的要求。因為即使只有一個用戶發出要求,也可能導致一個操作系統中多個進程的運行,進程之間必須互相通話。IPC介面就提供了這種可能性。每個IPC方法均有它自己的優點和局限性,一般,對於單個程序而言使用所有的IPC方法是不常見的。
1、無名管道通信
無名管道(pipe):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用,進程的親緣關系通常是指父子進程關系。
2、高級管道通信
高級管道(popen):將另一個程序當做一個新的進程在當前程序進程中啟動,則它算是當前程序的子進程,這種方式我們稱為高級管道方式。
3、有名管道通信
有名管道(named pipe):有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
4、消息隊列通信
消息隊列(message
queue):消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識,消息隊列克服了信號傳遞信息少、管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
5、信號量通信
信號量(semophore):信號量是一個計數器,可以用來控制多個進程對共享資源的訪問,它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
6、信號
信號(sinal):信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
7、共享內存通信
共享內存(shared
memory):共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
8、套接字通信
套接字(socket):套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信。

Ⅱ linux|進程間通信如何加鎖

進程間通信有一種[共享內存]方式,大家有沒有想過,這種通信方式中如何解決數據競爭問題?我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決線程間數據競爭問題,貌似沒有看到過它用在進程中,那怎麼辦?

關於進程間的通信方式估計大多數人都知道,這也是常見的面試八股文之一。

個人認為這種面試題沒什麼意義,無非就是答幾個關鍵詞而已,更深入的可能面試官和面試者都不太了解。

關於進程間通信方式我之前在【這篇文章】中有過介紹,感興趣的可以移步去看哈。

進程間通信有一種[共享內存]方式,大家有沒有想過,這種通信方式中如何解決數據競爭問題?

我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決線程間數據競爭問題,貌似沒有看到過它用在進程中,那怎麼辦?

我找到了兩種方法,信號量和互斥鎖。

直接給大家貼代碼吧,首先是信號量方式:

代碼中的MEOW_DEFER,它內部的函數會在生命周期結束後觸發。它的核心函數其實就是下面這四個:

具體含義大家應該看名字就知道,這里的重點就是sem_init中的pshared參數,該參數為1表示可在進程間共享,為0表示只在進程內部共享。

第二種方式是使用鎖,即pthread_mutex_t,可是pthread_mutex不是用作線程間數據競爭的嗎,怎麼能用在進程間呢?

可以給它配置一個屬性,示例代碼如下:

它的默認屬性是進程內私有,但是如果給它配置成PTHREAD_PROCESS_SHARED,它就可以用在進程間通信中。

相關視頻推薦

360度無死角講解進程管理,調度器的5種實現

Linux進程間通信-信號量、消息隊列和共享內存

學習地址:C/C++Linux伺服器開發/後台架構師【零聲教育】-學習視頻教程-騰訊課堂

需要C/C++ Linux伺服器架構師學習資料加qun812855908獲取(資料包括 C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg 等),免費分享

完整代碼如下:

我想這兩種方式應該可以滿足我們日常開發過程中的大多數需求。

鎖的方式介紹完之後,可能很多朋友自然就會想到原子變數,這塊我也搜索了一下。但是也不太確定C++標准中的atomic是否在進程間通信中有作用,不過看樣子boost中的atomic是可以用在進程間通信中的。

其實在研究這個問題的過程中,還找到了一些很多解決辦法,包括:

Disabling Interrupts

Lock Variables

Strict Alternation

Peterson's Solution

The TSL Instruction

Sleep and Wakeup

Semaphores

Mutexes

Monitors

Message Passing

Barriers

這里就不過多介紹啦,大家感興趣的可以自行查閱資料哈。

Ⅲ Linux操作系統具有哪些特點

LINUX系統的主要特點。\x0d\x0a1、開放性:特別是遵循開放系統互連(OSI)國際標准。\x0d\x0a2、多用戶:操作系統資源可以被不同用戶使用,每個用戶對自己的資源(例如:文件、設備)有特定的許可權,互不影響。\x0d\x0a3、多任務:計算機同時執行多個程序,而同時各個程序的運行互相獨立。\x0d\x0a4、良好的用戶界面:Linux向用戶提供了兩種界面:用戶界面和系統調用。Linux還為用戶提供了圖形用戶界面。它利用滑鼠、菜單、窗口、滾勱條等設施,給用戶呈現一個直觀、易操作、交互性強的友好的圖形化界面。\x0d\x0a5、設備獨立性:操作系統把所有外部設備統一當作成文件來看待,只要安裝驅勱程序,任何用戶都可以象使用文件一樣,操縱、使用這些設備。Linux是具有設備獨立性的操作系統,內核具有高度適應能力。\x0d\x0a6、提供了豐富的網路功能:完善的內置網路是Linux一大特點。\x0d\x0a7、可靠的安全系統:Linux採取了許多安全技術措施,包括對讀、寫控制、帶保護的子系統、審計跟蹤、核心授權等,這為網路多用戶環境中的用戶提供了必要的安全保障。\x0d\x0a8、良好的可移植性:將操作系統從一個平台轉移到另一個平台使它仍然能_其自身的方式運行的能力。Linux是一種可移植的操作系統,能夠在從微型計算機到大型計算機的任何環境中和任何平台上運行。

Ⅳ linux 進程間通信的幾種方式

1管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;
2信號(Signal):信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數);
3報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠許可權的進程可以向隊列中添加消息,被賦予讀許可權的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
4共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
5信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
6套介面(Socket):更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。

Ⅳ 請教一個關於linux消息隊列的問題

一般使用步驟:

1. 用ftok產生一個key。

2. 調用msgget(使用key作為參數)產生一個隊列

3. 進程可以用msgsnd發送消息到這個隊列,相應的別的進程用msgrcv讀取。

這里需要注意msgsnd可能會失敗的兩個情況:

a) 可能被中斷打斷(包括msgsnd和msgrcv). 尤其是大流量應用中更容易出現. 比較安全的用法是判斷操作是否被中斷打斷,如果被打斷, 則需要繼續嘗試。

b) 消息隊列滿。產生這個錯誤,則需要考慮提高系統消息隊列規格,或者查看消息接收處是否有問題

4. msgctl函數可以用來刪除消息隊列
消息隊列產生之後,除非明確的刪除(可以用),產生的隊列會一直保留在系統中。linux下消息隊列的個數是有限的,注意不要泄露。如果 使用已經達到上限,msgget調用會失敗,產生的錯誤碼對應的提示信息為no space left on device.

注意點:

1.消息的類型 mtype 不需為非0值。如果使用0,則msgsnd會失敗,並得到」Invalid argument「錯誤。

2.msgflg為0表示阻塞等待,如果msgflg為IPC_NOWAIT表示非阻塞。

3.最好使用root許可權執行消息隊列,否則msgrcv 提示 "Permission denied"。

Ⅵ linux系統的進程間通信有哪幾種方式

一、方式

1、管道(Pipe)及有名管道( mkpipe):

管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;

2、信號(Signal):

信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身。

linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction。

實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數。

3、消息隊列(Message):

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

4、共享內存:

使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

5、信號量(semaphore):

主要作為進程間以及同一進程不同線程之間的同步手段。

6、套介面(Socket):

更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。

二、概念

進程間通信概念:

IPC—-InterProcess Communication

每個進程各自有不同的用戶地址空間,任何一個進程的全局變數在另一個進程中都看不到所以進程之間要交換數據必須通過內核。

在內核中開辟一塊緩沖區,進程1把數據從用戶空間拷到內核緩沖區,進程2再從內核緩沖區把數據讀走,內核提供的這種機制稱為進程間通信。

(6)消息隊列linux擴展閱讀

1)無名管道:

管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用於父子進程或者兄弟進程之間(具有親緣關系的進程)。

管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,構成兩進程間通信的一個媒介。

數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,並且每次都是從緩沖區的頭部讀出數據。

2)有名管道:

不同於管道之處在於它提供一個路徑名與之關聯,以FIFO的文件形式存在於文件系統中。這樣,即使與FIFO的創建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創建進程之間)。

因此,通過FIFO不相關的進程也能交換數據。值得注意的是,FIFO嚴格遵循先進先出(first in first out),對管道及FIFO的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如lseek()等文件定位操作。



熱點內容
安卓對蘋果怎麼傳通訊錄 發布:2025-03-10 10:47:11 瀏覽:403
十周年源碼 發布:2025-03-10 10:42:09 瀏覽:239
安卓手機內存卡怎麼解決 發布:2025-03-10 10:39:39 瀏覽:964
雲引擎雲伺服器 發布:2025-03-10 10:39:39 瀏覽:672
安卓部落沖突怎麼加好友 發布:2025-03-10 10:38:06 瀏覽:151
如何查詢伺服器的sn 發布:2025-03-10 10:36:40 瀏覽:588
為什麼越來越多人從蘋果轉向安卓 發布:2025-03-10 10:28:08 瀏覽:105
php正則結尾 發布:2025-03-10 10:19:57 瀏覽:780
影音先鋒在線腳本 發布:2025-03-10 10:10:51 瀏覽:421
油猴萬能腳本 發布:2025-03-10 10:09:10 瀏覽:445