linux proc文件 write的原子性,Linux命令之write調用的原子性

linux命令是對Linux系統進行管理的命令。本文介紹的關于linux命令中write調用的原子性的詳細描述,具體內容如下所述。

UNIX環境高級編程中關于原子操作的介紹,其中有一種情形是在文件尾端添加數據。

文中說,如果多個進程都需要將數據添加到某一文件,那么為了保證定位和寫數據這兩步是一個原子操作,需要在打開文件時設置O_APPEND標志,看到這里我們就會想,雖然保證了定位和寫數據是一個原子操作,但是是否能夠保證多個進程或線程寫入的數據不會交錯呢,比如A進程調用write(filedes1,"AAA",3),B進程調用write(filedes2,"BBBB",4)(其中filedes1和filedes2指向同一個文件),但是***文件中的數據是否有可能是AABBBAB,如果這個文件是一個管道或socket呢。

linuxman手冊頁中關于write調用的說明很不詳細,并未說明寫操作是否是原子的,所以我們有必要查找SingleUNIXSpecification(SUS)對write調用的說明,在SUS中對此調用的說明還是比較詳細的。在繼續討論之前我們需要清楚內核在寫文件之前會對該文件加鎖,不管是否成功完成寫操作,在返回之前都會解鎖。

下面我們就以三種常見的文件根據SUS標準來討論上面提出的這個問題:

1.普通文件

SUS中也沒有說明在寫普通文件時是否會保證是原子操作,但是它說明了write調用可能并不能完全把我們需要寫入的數據寫到文件中去,那么什么情況下可能少寫數據呢?

SUS說明了兩種情況:磁盤已滿或則要寫入的文件的大小超過了當前進程的文件大小限制。其實至少還有一種情況,那就是內核中的高速緩存不夠用的時候,比如linux內核在發現高速緩存不夠用的時候就只寫入實際能夠容下的數據然后返回。正是由于存在上述***一種情況,所以說按照APUE那種方法在linux下面寫文件并不能保證我們的數據不會交錯(不過我們可以根據write的返回值得知是否有發生交錯的可能)。

其它的unix內核可能會在實現上不同于linux內核,他們可能在寫之前就判斷一下緩沖區是否足夠容納所有數據,如果是這種情況,寫操作應該就是原子的;也可能寫了一部分數據后才發現緩沖區不夠用并讓當前進程進入睡眠狀態,此時內核如果解鎖,那么在當前進程睡眠期間其它進程可能寫了數據,如果不解鎖,那么就是原子操作,其他進程不可能在這個時候寫入數據。由上面的分析可知,正是由于SUS標準不太完整的標準,我們不能確定一定可以按APUE的方法來同時向同一個普通文件寫數據。

如果我們非要在同一個文件中記錄多個進程產生的數據,我們***采用unix日志系統采用的方法,用一個專用進程處理文件IO,其它進程把需要寫的數據發送給這個專用進程,這樣應該比多個進程同時寫一個文件可靠和高效。

2.管道

SUS對管道的寫操作說得更多也更明確,我們只需遵照其標準就可以了。對于write(pipefd,buf,nbyte),其要點如下:

如果nbyte<=PIPE_BUF,不管O_NONBLOCK是否設置,其寫操作都是原子的,就是說多個進程都在此條件下同時寫同一個管道不會引起數據交錯。

如果nbyte>PIPE_BUF,是不能保證寫操作是原子的,寫入的數據可能與其他進程寫入的數據交錯。

3.socket

SUS中對于寫socket并沒有說很多,我們無法從標準中得知write是否保證寫操作的原子性。我看了一下linux2.6.14內核關于tcp數據的寫操作,發現它不是原子的,也從網上查到了這部分代碼的作者(們)對這個問題的看法,他(們)認為對一個可能***阻塞的操作保證原子性是錯誤的。我們也只能姑且這么認為了。

補充:

對于用UNIX日志系統服務器的方法,連接端必須每個線程connect一次logsvr,這樣才能保證發過來的日志數據不互相錯亂,保證原子性;此時logsvr只要用reactor方法來處理每個線程的連接就好,把這些fd放到隊列里輪流處理,寫文件,也保證了寫文件的原子性。

實際上日志服務器一般都是用UDP來完成的。

總結:

希望本文介紹的Linux命令中write調用的原子性的內容能夠對讀者有所幫助,更多有關linux系統的知識還有待于讀者去探索和學習。

【編輯推薦】

【責任編輯:韓亞珊 TEL:(010)68476606】

點贊 0

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

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

相關文章

linux 命令行 迅雷替代,Mac/Linux下迅雷替代方案

還記得我兩年前寫的《DIY了家用NAS》嗎&#xff1f;現在又帶來新的升級啦。當初的NAS最多能使用Transmission來進行BT下載&#xff0c;那時就在想&#xff0c;如果能下載普通的http資源就好了。再進一步&#xff0c;有什么方案可以通吃所有下載方式呢&#xff1f; 記得那個時候…

linux好用的編譯器,推薦幾款Linux下比Notepad++好的編輯器軟件

Notepad這一段又出風頭了&#xff0c;好好的做你軟件多好&#xff0c;非得參雜入政治。前兩天開源文本編輯器 Notepad 發布了 7.8.1 版本&#xff0c;然后在該版本中作者居然摸黑中國&#xff0c;具體的內容請大家自行百度。而且這已經不是 Notepad 第一次這么干了&#xff01;…

linux下調用python腳本,Linux下QT調用Python腳本的解決方案,Qt,python,一種,解決辦法

最近在做一個深度學習對圖片中對象識別效果的檢測工具&#xff0c;其主要功能就是將自己標注的圖片與識別結果圖片進行對比然后計算識別的準確等參數&#xff0c;并提供原圖與結果圖片的顯示功能。腳本主要完成識別與計算功能&#xff0c;QT完成數據的整理顯示與圖片的顯示。我…

linux獲取bind返回值信息,v$sql_bind_capture 獲取綁定變量信息

截取自v$sql_bind_capture 對于游標中定義的每一個綁定變量都會有視圖中的一行對應。主要包含三個部分&#xff1a;指向父游標(hash_value, address)和子游標(hash_value, child_address)的信息,變量類型定義&#xff0c;變量的值(不包含復雜的值&#xff1a;LONG,LOB,和…

linux boost教程,Linux上安裝使用Boost入門指導

獲得boostboost分布只需要頭文件的庫使用boost建立一個簡單的程序準備使用boost二進制文件庫把你的程序鏈接到boost庫1.獲得boost解壓2.boost分布boost_1_46_1.........................boost根目錄boost/.....................................所有boost頭文件libs/..........…

vps如何linux內核4.19,Linux kernel 4.19 RC1 發布,一個相當大的版本

原標題&#xff1a;Linux kernel 4.19 RC1 發布&#xff0c;一個相當大的版本Linus Torvalds今天發布了第一個候選版本(RC)&#xff0c;正式啟動了即將推出的Linux 4.19內核系列的開發周期。自Linux 4.18內核系列推出以來已經過去兩周了&#xff0c;因此下一個主要版本Linux ke…

linux下變量名長度,Linux中shell的變量介紹

Linux中shell的變量介紹發布時間&#xff1a;2020-06-24 16:20:39來源&#xff1a;億速云閱讀&#xff1a;112作者&#xff1a;元一這期內容當中的小編將會給大家帶來有關Linux中shell的變量介紹&#xff0c;以專業的角度為大家分析和敘述&#xff0c;閱讀完這篇文章希望大家可…

0 0/2 * * * ? linux文本含義,Linux基礎2.0

1、硬盤使用的步驟識別硬盤 > 分區規劃 > 格式化 > 掛載使用2、列出創建ext3、ext4、xfs、fat32文件系統的格式化工具及用法mkfs.ext3 分區設備路徑mkfs.ext4 分區設備路徑mkfs.xfs 分區設備路徑mkfs.vfat -F 32 分區設備路徑3、開機自動掛載配置文件及6個字段/etc/fs…

linux如何加載鏡像,linux可以加載iso鏡像文件到啟動項嗎

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓樓主的需求描述不清&#xff0c;不作評述。只說下關于樓上一些吧友提到的grub loopback設備可mount iso并讀取其中文件的功能未讀過grub1/2的源碼&#xff0c;不太了解其實現原理&#xff0c;但從應用上來說&#xff0c;這個設備不…

10個linux awk文本處理經典案例,關于AWK的10個經典案例

1、分析訪問日志(Nginx為例)日志格式&#xff1a; $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" 統計訪問IP次數&#xff1a; # awk…

arm linux 存儲,linux arm的存儲分布那些事

原標題&#xff1a;linux arm的存儲分布那些事linux arm 內存分布總覽上圖是linux的arm的虛擬地址分布總覽&#xff0c;我們按從低地址到高地址的順序逐個描述&#xff0c;每項的描述包括如下的內容的組和&#xff1a;地址范圍大小&#xff0c;虛擬轉物理的接口函數&#xff0c…

linux恢復終端默認配置,以gnome-terminal為例,修改gnome3 的默認配置,

以gnome-terminal為例&#xff0c;修改gnome3 的默認配置&#xff0c;gnome連續幾個版本的terminal默認配置文件都是同一個配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”。這是因為gnome的developers編輯了這個配置文件并作為gnome-terminal的默認配置文件&#xff0c;用來…

c語言字符串文庫總結,C語言程序設計入門:字符串函數

版權聲明&#xff1a;以上文章中所選用的圖片及文字來源于網絡以及用戶投稿&#xff0c;由于未聯系到知識產權人或未發現有關知識產權的登記&#xff0c;如有知識產權人并不愿意我們使用&#xff0c;如果有侵權請立即聯系&#xff1a;55525090qq.com&#xff0c;我們立即下架或…

vs寫c語言能用scanf,【PAT編寫代碼時遇到的問題】vs中使用scanf(%c,x);

首先&#xff0c;為了在VS中使用scanf&#xff0c;可以在程序開頭加上#pragma warning(disable:4996)昨天在編寫程序的時候&#xff0c;突然發現在循環中使用scanf("%c",&x);的時候&#xff0c;發現結果很奇怪&#xff0c;只能讀入和輸出我所輸入的數據的一半。后…

大數計算器概念c語言,用C語言求兩個超大整數的和

用C語言求兩個超大整數的和在生活中&#xff0c;我們經常需要計算非常大的數&#xff0c;但是任何一種計算器都有計算范圍&#xff0c;一旦超過計算范圍就會有精度的損失。或許有同學認為我們可以通過程序來解決&#xff0c;比如對于C語言來說&#xff0c;我們定義一個long lon…

3 5的二維數組C語言程序,C語言及程序設計提高例程-33 二維數組元素的引用

賀老師教學鏈接 C語言及程序設計提高 本課講解輸入輸出二維數組元素#include int main(){int s[3][5], i, j;printf("Input 3*5 numbers\n");for (i0; i<3; i)for(j0; j<5; j)scanf("%d", &s[i][j]);for (i0; i<3; i){for(j0; j<5; j)pri…

android程序 幻燈片,Android:ViewPager制作幻燈片

public class MainActivity extendsActivity {//ViewPagerprivateViewPager viewpager;//幻燈片圖片資源private int [] imgArray{R.drawable.view1,R.drawable.view2,R.drawable.view3};//圖片數組private ArrayListviewlist;privateImageView imageView;//點點privateViewGro…

android獲取圖片方向并旋轉,Android 判斷imageview角度并旋轉

/*** 讀取照片exif信息中的旋轉角度** return角度 獲取從相冊中選中圖片的角度*/public static float readPictureDegree(String path) {int degree 0;try {ExifInterface exifInterface new ExifInterface(path);int orientation exifInterface.getAttributeInt(ExifInterf…

android鍵盤移動光標,在Android鍵盤上完成鍵

Jos Silva..12代替ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));嘗試ic.performEditorAction(EditorInfo.IME_ACTION_GO);執行的操作應該是在EditorInfo上定義的操作,它將在方法onStartInputView上傳遞給您要在操作之間切換,請使用:(sEditorI…

android 遠程桌面連接閃退,遠程桌面一點連接就閃退,不能彈出輸入賬號密碼窗口...

您好&#xff0c;感謝您在我們論壇發帖。首先&#xff0c;按照您的描述&#xff0c;正常情況下&#xff0c;您的客戶端可以遠程連接您的服務器&#xff0c;輸入IP和端口之后&#xff0c;會彈出驗證框&#xff0c;輸入賬戶密碼之后即可進入服務器的桌面。當出現問題時&#xff0…