linux 有名管道FIFO

????????無名管道應用的一個重大限制是它沒有名字,因此,只能用于具有親緣關系的進程間通信,在有名管道(named pipe或FIFO)提出后,該限制得到了克服。FIFO不同于管道之處在于它提供一個路徑名與之關聯,以FIFO的文件形式存在于文件系統中(其實這個文件系統就是系統的內存)。這樣,即使與FIFO的創建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創建進程之間),因此,通過FIFO不相關的進程也能交換數據。

  1. FIFO 在文件系統中作為一個特殊的文件而存在,但 FIFO 中的內容卻存放在內存中。
  2. 當使用 FIFO 的進程退出后,FIFO 文件將繼續保存在文件系統中以便以后使用。
  3. FIFO 有名字,不相關的進程可以通過打開命名管道進行通信。

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

????????管道的緩沖區是有限的(管道制存在于內存中,在管道創建時,為緩沖區分配一個頁面大小)管道所傳送的是無格式字節流,這就要求管道的讀出方和寫入方必須事先約定好數據的格式,比如多少字節算作一個消息(或命令、或記錄)等等。

????????如果當前打開操作是為讀而打開FIFO時,若已經有相應進程為寫而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為寫而打開該FIFO(當前打開操作設置了阻塞標志);或者,成功返回(當前打開操作沒有設置阻塞標志)。

????????如果當前打開操作是為寫而打開FIFO時,如果已經有相應進程為讀而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為讀而打開該FIFO(當前打開操作設置了阻塞標志);或者,返回ENXIO錯誤(當前打開操作沒有設置阻塞標志)。

????????一旦設置了阻塞標志,調用mkfifo建立好之后,那么管道的兩端讀寫必須分別打開,有任何一方未打開,則在調用open的時候就阻塞。

約定:如果一個進程為了從FIFO中讀取數據而阻塞打開FIFO,那么稱該進程內的讀操作為設置了阻塞標志的讀操作。(意思就是我現在要打開一個有名管道來讀數據!)
?

可以理解為管道的兩端都建立好了,但是寫端還沒開始寫數據!

則對于設置了阻塞標志的讀操作來說,將一直阻塞(就是block住了,等待數據。它并不消耗CPU資源,這種進程的同步方式對CPU而言是非常有效率的)。

????????對于沒有設置阻塞標志讀操作來說則返回-1,當前errno值為EAGAIN,提醒以后再試。造成阻塞的原因有兩種:

  • FIFO內有數據,但有其它進程在讀這些數據(對于各個讀進程而言,這根有名管道是臨界資源,大家得互相謙讓,不能一起用)。
  • FIFO內沒有數據。解阻塞的原因則是FIFO中有新的數據寫入,不論信寫入數據量的大小,也不論讀操作請求多少數據量。

注:如果FIFO中有數據,則設置了阻塞標志的讀操作不會因為FIFO中的字節數小于請求讀的字節數而阻塞,此時,讀操作會返回FIFO中現有的數據量。

約定:如果一個進程為了向FIFO中寫入數據而阻塞打開FIFO,那么稱該進程內的寫操作為設置了阻塞標志的寫操作。(意思就是我現在要打開一個有名管道來寫數據!)
?

當要寫入的數據量不大于PIPE_BUF 時,linux將保證寫入的原子性。如果此時管道空閑緩沖區不足以容納要寫入的字節數,則進入睡眠,直到當緩沖區中能夠容納要寫入的字節數時,才開始進行 一次性寫操作。(PIPE_BUF ==>> /usr/include/linux/limits.h)

當要寫入的數據量大于PIPE_BUF時,linux將不再保證寫入的原子性。FIFO緩沖區一有空閑區域,寫進程就會試圖向管道寫入數據,寫操作在寫完所有請求寫的數據后返回。
?

當要寫入的數據量大于PIPE_BUF時,linux將不再保證寫入的原子性。在寫滿所有FIFO空閑緩沖區后,寫操作返回。
當要寫入的數據量不大于PIPE_BUF時,linux將保證寫入的原子性。如果當前FIFO空閑緩沖區能夠容納請求寫入的字節數,寫完后成功返回;如果當前FIFO空閑緩沖區不能夠容納請求寫入的字節數,則返回EAGAIN錯誤,提醒以后再寫;
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14307.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14307.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14307.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云原生|為什么服務網格能夠輕松重塑微服務?一文講清楚!

目錄 一、概述 二、 設計 三、服務網格 四、總結 一、概述 容器化技術與容器編排推動了微服務架構應用的演進,于是應用的擴展與微服務的數量日益增加,新的問題隨之而來,監控服務的性能變得越來越困難,微服務與微服務之間相互通…

v-rep--lua接口和c++接口的關聯

我們在coppeliasim中調用的lua腳本函數sim.xxxxx()的執行規律有兩種情況: 1,要么就是在coppliasim的sim.lua中有這個lua函數的定義,直接執行這個lua函數即可。比如,sim.creatPath(); 2,要么就是這個lua接口沒有lua語…

Kafka-集群管理者(Controller)選舉機制、任期(epoch)機制

Kafka概述 Kafka-集群管理者(Controller)選舉機制 Kafka中的Controller是Kafka集群中的一個特殊角色,負責對整個集群進行管理和協調。Controller的主要職責包括分區分配、副本管理、Leader選舉等。當當前的Controller節點失效或需要進行重新…

嵌入式實時操作系統筆記1:RTOS入門_理解簡單的OS系統

今日開始學習嵌入式實時操作系統RTOS:UCOS-III實時操作系統 本次目標是入門RTOS,理解多任務系統...... 本文只是個人學習筆記,基本都是對網上資料的整合...... 目錄 STM32裸機與RTOS區別: 裸機中斷示例: RTOS對優先級…

汽車標定技術(二十一)--英飛凌TC3xx的OLDA怎么玩?(2)

目錄 1.概述 2.Vector提出的OLDA概念 2.1 RAM Copy 2.2 Data Trace 3.小結 1.概述 上一篇汽車標定技術(二十一)--英飛凌TC3xx的OLDA怎么玩?(1)-CSDN博客,我們講了TC3xx

Spring MVC/Web

1.Spring MVC 的介紹 Spring Web MVC是基于Servlet API構建的原始Web框架,也是Spring框架的一部分。它提供了靈活可擴展的MVC架構,方便開發者構建高性能的Web應用程序,并與 Spring 生態系統無縫集成。 2.MVC 設計模式 MVC(Model…

設計模式—23種設計模式重點 表格梳理

設計模式的核心在于提供了相關的問題的解決方案,使得人們可以更加簡單方便的復用成功的設計和體系結構。 按照設計模式的目的可以分為三大類。創建型模式與對象的創建有關;結構型模式處理類或對象的組合;行為型模式對類或對象怎樣交互和怎樣…

CSS實現圖片浮動在底層 div 之上,而不會影響底層 div 的布局和內容

前言&#xff1a;遇到個需求&#xff0c;需要圖片顯示在div之上&#xff0c;但是不占用div的空間布局&#xff0c;網上的答案五花八門&#xff0c;但其實使用css就可以簡單實現&#xff0c;僅以此博客作為記錄 舉個栗子 <div class"container"><img src&qu…

Linux 網絡編程基礎——網絡模型

網絡模型 網絡模型1. OSI七層模型1. 物理層&#xff08;Physical Layer&#xff09;2. 數據鏈路層&#xff08;Data Link Layer&#xff09;3. 網絡層&#xff08;Network Layer&#xff09;4. 傳輸層&#xff08;Transport Layer&#xff09;5. 會話層&#xff08;Session Lay…

研發機構大數據遷移如何保障敏感數據不泄露

隨著云計算和大數據技術的飛速進步&#xff0c;越來越多的企業正試圖通過數據遷移來提升IT基礎設施的效率&#xff0c;減少成本&#xff0c;并增強業務的靈活性。但是&#xff0c;這一過程并非沒有它的挑戰&#xff0c;尤其是在數據安全方面。數據在轉移過程中可能會遭遇黑客攻…

SQL的多表聯查

這里我先附上兩張表的數據&#xff1a; Orders 表: OrderIDCustomerID1321324NULL Customers 表: CustomerIDCustomerName1Alice2Bob3Charlie4David INNER JOIN &#x1f91d; 概念&#xff1a; INNER JOIN&#xff08;內連接&#xff09;返回兩個表中匹配的記錄。如果某條…

解決深度確定問題:使用不相交集合森林

解決深度確定問題&#xff1a;使用不相交集合森林 引言不相交集合森林&#xff08;DSF&#xff09;基礎按秩合并與路徑壓縮深度確定問題的解決方案實現MAKE-TREE修改FIND-SET實現FIND-DEPTH實現GRAFT分析最壞情況運行時間結論參考文獻 引言 在計算機科學中&#xff0c;樹結構是…

時空扭曲:重溫相對論的終極挑戰,探尋真理的腳步

大家都知道&#xff0c;相對論是愛因斯坦提出的劃時代理論&#xff0c;為人類認知時空和引力做出了革命性貢獻。但這個理論真的萬無一失嗎&#xff1f;近日&#xff0c;一項新研究提出了測試時間扭曲的新方法&#xff0c;或許能讓我們重新審視相對論在宇宙大尺度上的適用性。 時…

HTML5好看的通用網站模板源碼

文章目錄 1.設計來源1.1 主界面1.2 模板菜單1 界面1.3 模板菜單2 界面1.4 模板菜單3 界面1.5 下拉菜單1 界面1.6 下拉菜單2 界面1.7 模板菜單4 界面1.8 模板菜單5 界面1.9 界面底部 2.效果和源碼2.1 動態效果2.2 源碼目錄2.3 源代碼 源碼下載 作者&#xff1a;xcLeigh 文章地址…

Python 造數據神器Faker

大家好&#xff0c;在編寫代碼過程中&#xff0c;我們經常需要一些假數據來進行測試或者演示。手動創建這些數據不僅耗時&#xff0c;而且容易出錯。幸運的是&#xff0c;Python有一個非常有用的庫叫做Faker&#xff0c;它可以生成各種類型的假數據&#xff0c;從名字、地址到公…

【驅動】ARM手冊引腳寄存器地址(絕對物理地址)查找(以AM437x為例)

1、問題描述 在配置設備樹時,經常遇到如下宏: XXX_IOPAD(pa, val)實際定義如下: DRA7XX_CORE_IOPAD(pa, val) AM33XX_IOPAD(pa, val) DM816X_IOPAD(pa, val) DM814X_IOPAD(pa, val) AM4372_IOPAD(pa, val)一般注釋中的說明如下: 原文:Macro to allow using the absol…

md5和byte64字符串加密

說明&#xff1a;最近碰到一個需求&#xff0c;網絡請求&#xff0c;傳遞json的時候&#xff0c;必須加密&#xff0c;對字符串加密&#xff0c;然后前端去解密字符串&#xff0c;然后解析json&#xff0c;展示數據&#xff0c;可逆 step1: Md5加密方式 package com.example.…

Java技術精粹:高級面試問題與解答指南(一)

Java 面試問題及答案 問題1&#xff1a;請解釋Java中的多態性&#xff0c;并給出一個例子。 答案&#xff1a; 多態性是Java中的一個重要特性&#xff0c;它允許一個引用類型可以指向多種實際類型的對象&#xff0c;并且可以通過這個引用調用實際對象的方法。多態性主要通過繼…

JAVA:常見的加密算法簡介

一、前言 加密算法是指將明文信息轉變為密文信息的過程&#xff0c;即將信息從可讀形式&#xff08;明文&#xff09;轉換為加密形式&#xff08;密文&#xff09;的過程。在加密過程中&#xff0c;信息通過加密算法和加密密鑰被加密處理&#xff0c;加密后的信息&#xff08;密…

【代碼隨想錄算法訓練Day17】LeetCode 110. 平衡二叉樹、LeetCode 257.二叉樹的所有路徑、LeetCode 404.左葉子之和

Day17 二叉樹第四天 LeetCode 110. 平衡二叉樹【后序遍歷】 平衡二叉樹仍是后序遍歷&#xff0c;就是獲取左右子樹的高度然后作差&#xff0c;如果子樹就不平衡&#xff0c;那么就直接將-1向上傳給父節點&#xff0c;否則該數的高度為左右子樹高度的最大值1。 class Solutio…