Linux管道命令,Linux管道的原子性,管道的原子性 linux寫操作原子性

 2023-10-05 阅读 30 评论 0

摘要:從本質上說,管道也是一種文件,但他又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題限制管道的大小。實際上,管道是一個固定大小的緩沖區。在Linux中該換沖區的大小為一頁,4k使得他的大小不像文件那樣不加檢驗的增長。使用

從本質上說,管道也是一種文件,但他又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題

限制管道的大小。實際上,管道是一個固定大小的緩沖區。在Linux中該換沖區的大小為一頁,4k

使得他的大小不像文件那樣不加檢驗的增長。使用固定緩沖區也會帶來問題,比如再寫管道時可能變滿

當這種情況發生時,隨后對管道的write()調用被阻塞,等待某些數據被讀取,以便騰出足夠的空間供

write()調用。

Linux管道命令,讀取工作也可能比寫的進程快。當所有進程的數據被讀取完時,一個隨后的read()調用將默認的被阻塞、

管道變空。這種情況發生時,一個隨后的read()調用將被默認的阻塞,等待某些數據被寫入,這樣就解決了read()

調用將被默認的阻塞,等待某些數據將被寫入,這解決了read()調用返回文件結束的問題。

一個管道的容量是有限的。POSIX規定,少于 PIPE_BUF 的寫操作必須原子完成:要寫的數據應被連續的寫到管道;大于 PIPE_BUF 的寫操作可能是非原子的: 內核可能會把此數據與其它進程的對此管道的寫操作交替起來。POSIX規定PIPE_BUF至少為512B(linux中為4096B),具體的語義如下: 其中n為要寫的字節數

n <= PIPE_BUF, O_NONBLOCK無效:原子的寫入n個字節。如果管道當前的剩余空間不足以立即寫入n個字節,就阻塞直到有足夠的空間。

n <= PIPE_BUF, O_NONBLOCK有效:寫入具有原子性,如果有足夠的空間寫入n個字節,write立即成功返回。否則一個都不寫入,返回錯誤,并設置errno為EAGAIN。

UNIX/LINUX?n > PIPE_BUF, O_NONBLOCK無效:非原子寫。可能會和其它的寫進程交替寫。write阻塞直到將n個字節寫入管道。

n > PIPE_BUF, O_NONBLOCK有效:如果管道滿,則write失敗,返回錯誤,并將errno設置為 EAGIN。如果不滿,則返回寫入的字節數為1~n,即部分寫入,寫入時可能有其他進程穿插寫入。

結論:

1、當要寫入的數據量不大于PIPE_BUF時,linux將保證寫入的原子性。

2、當要寫入的數據量大于PIPE_BUF時,linux將不再保證寫入的原子性。

Linux數據寫操作改進

redis pipeline原子性。Linux的IO操作中數據的寫函數int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符寫入len個字節長度的數據報文,但是這并不能保證真正向內 ...

使用C&num;給Linux寫Shell腳本(下篇)

在上篇的結尾中,我們留下了一個關于C#如何調用BashShell的問題.在文章發布之后,我留意到有讀者留言推薦使用“Pash”(一款類PowerSh ...

NoSQL生態系統——事務機制,行鎖,LSM,緩存多次寫操作,RWN

13.2.4 事務機制 NoSQL系統通常注重性能和擴展性,而非事務機制. 傳統的SQL數據庫的事務通常都是支持ACID的強事務機制.要保證數據的一致性,通常多個事務是不可能交叉執行的,這樣就導致了可 ...

linux常用操作指令

linux自旋鎖,Linux常用操作指令: 常用指令 ls ? ? ? ?顯示文件或目錄 -l ? ? ? ? ? 列出文件詳細信息l(list) -a ? ? ? ? ?列出當前目錄下所有文件及目錄,包括隱藏的a(a ...

你一定要知道的關于Linux文件目錄操作的12個常用命令

寫在前面: 1,是樓主收集的關于Linux文件目錄操作最常用的命令,包括文件或目錄的新建.拷貝.移動.刪除.查看等,是開發人員操 ...

Linux常用操作練習

Linux常用操作練習 練習一:安裝CentOS 1.設置為1G內存(才有圖形界面).10G硬盤 2.分給交換分區2G(4G一下2G,8G-32G分4G-8G) 練習二:安裝CentOS迷你版 1.安 ...

linux 常用操作以及概念

shell封裝。一.常用操作以及概念 查看LINUX發行版的名稱及其版本號的命令: lsb_release -a cat /etc/redhat-release(針對redhat,Fedora) 0.rpm包路徑:/ ...

python通過SSH登陸linux并操作

使用python通過SSH登陸linux并操作 用的昨天剛接觸到的庫,在windows下通過paramiko來登錄linux系統并執行了幾個命令,基本算是初試成功,后面會接著學習的. 代碼: > ...

多線程之:volatile變量的一次寫操作的過程

一:對volatile修飾的變量進行一次寫操作的完整過程 ??在 java 垃圾回收整理一文中,描述了jvm運行時刻內存的分配.其中有一個內存區域是jvm虛擬機棧,每一個線程運行時都有一個線程棧,線程 ...

隨機推薦

linux管道輸出。log4j2的使用

預備知識 日志級別:log4j默認六個級別,即trace.debug.info.warn.error.fatal ,對應意味著該消息為追蹤.調試.普通信息.警告.錯誤.嚴重錯誤.可以根據需要子定義其他 ...

C&num;&period;Net 上傳圖片&comma;限制圖片大小&comma;檢查類型完整版

C#.Net 上傳圖片,限制圖片大小,檢查類型完整版 源代碼: 處理圖片類,如檢查圖片大小,按寬度比例縮小圖片 public?class?CImageLibrary{???public?enum?Va ...

iOS學習筆記---c語言第九天

高級指針 指向結構體變量的指針,稱為結構體指針 可以使用->指向內容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求兩點間的距離??用的開方函數sq ...

linux管道文件、【jmeter】JMeter處理Cookie與Session

有些網站保存信息是使用Cookie,有些則是使用Session.對于這兩種方式,JMeter都給予一定的支持. 1.Cookie 添加方式:線程組-配置元件-HTTP Cookie 管理器,如下圖: ...

lucene、lucene&period;NET詳細使用與優化詳解

lucene.lucene.NET詳細使用與優化詳解?2010-02-01 13:51:11 分類:?Linux 1 lucene簡介1.1 什么是luceneLucene是一個全文搜索框架,而不是應 ...

學習pthreads,使用互斥量進行同步

在進行多線程編程時,我們總會遇到全局變量和數據結構的問題,這是多線程之間進行通信的問題.如果多個線程同時讀寫一個全局變量,那么會造成競爭或者出錯.為了解決這一問題,我們需要對全局數據進行,使用互斥量實 ...

原子linux?redis緩存數據庫

redis 介紹 redis是業界主流的key-value nosql 數據庫之一.和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串).list(鏈表).set( ...

POJ 2923 Relocation 裝車問題 【狀態壓縮DP】&plus;【01背包】

題目鏈接:https://vjudge.net/contest/103424#problem/I 轉載于:>>>大牛博客 題目大意: 有 n 個貨物,并且知道了每個貨物的重量,每次用 ...

JFreeChart工具類

需要的jar包: jfreechart-1.0.17.jarjcommon-1.0.24.jar (jfreechart一般只要1.0系列的都可以,jcommon一般任何版本都可以) 效果: 代碼: ...

shell管道、linux install jupyter notebook

install sudo pip install jupyter notebook start sudo jupyter notebook 一般,文件目錄默認在你啟動的位置.你可以在notebook里 ...

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/115123.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息