1. 程式人生 > >linux 檔案io常用操作總結

linux 檔案io常用操作總結

對檔案的操作,究根結底也就是那麼幾種行為,分別為開啟,讀,寫,關閉。 一、檔案描述符:至於什麼是檔案描述符,這個是很簡單的概念。 二、開啟檔案 open(path,flag,...) 1、建立新檔案 open(path,O_CREAT,filemode) 當建立一個新檔案的時候,可以使用 O_CREAT 和 O_EXCL 組合,這樣可以保證新檔案一定是由當前程序建立。 2、O_APPEND標識 這是一個檔案狀態標識,對該檔案的所有寫操作之前都會講檔案指標移動到檔案的末尾,這樣就相當於追加寫。這是一個原子操作。 三、讀檔案 read(fd,buf,len):從fd代表的檔案讀取 len 長度的位元組內容,內容儲存到 buf 緩衝區中。
四、寫檔案 write(fd,buf,len):將buf緩衝區中的內容寫到fd指向的檔案,長度為len 五、關閉檔案 close(fd); 程序結束之後,OS會自動關閉所有開啟的檔案描述符,但是最好自己主動關閉,因為檔案描述符是一種資源,如果開啟的數量太多,可能造成後續的open操作失敗。 六、設定檔案的偏移量 lseek(fd,offset,whence) 如果執行成功則返回此時的檔案偏移量,如果失敗,則返回 -1,所以可以利用這個函式來判斷一個檔案是否可以設定偏移量。例如管道就不可以設定偏移量。 七、原子定位並讀寫 pread(fd,buf,nbytes,offset) pwrite(fd,buf,nbytes,offset)
  • offset:表示從哪個位置開始讀取或者寫入資料。偏移量是從檔案開頭開始計算
pread和pwrite函式是linux提供的另一種讀寫檔案的函式,pread()相當於順序呼叫了 lseek() 和 read() 函式。pwrite也類似。但是這個過程是原子的,即呼叫 lseek()和 read/write 的過程是原子的。 八、檔案描述符操作 dup(fd) dup2(fd,fd2) 這兩個函式可以複製一個檔案描述符,但是返回的新的檔案描述符中的 O_CLOEXEC標識都會被清除。 fcntl()這個函式可以對檔案描述符的一些屬性進行設定。因為有的時候我們只能拿到檔案描述符,所以只能通過這個函式對檔案描述符進行設定或者獲取一些檔案的資訊。比如管道,我們就只知道他們的檔案描述符。
八、注意事項: read和write之後檔案的偏移量會跟著改變,但是pread和pwrite並不會改變檔案的偏移量。 九、核心中關於檔案的幾個資料結構 1、核心為每個程序維護一個程序表項,這個資料結構是一個數組,儲存了檔案描述符的一些資訊,比如檔案描述符標識(O_CLOEXEC). 2、核心為每個開啟的檔案維護一個檔案表項。這個資料結構中儲存了當前檔案的偏移量。同一個程序多次開啟同一個檔案,那麼核心會為該檔案維護多個檔案表項,這樣每個檔案描述符都會有自己的當前檔案偏移量。 3、v節點表。一個物理檔案對應一個v節點。同一個檔案只會有一個v節點。
開啟檔案的核心資料結構 十一、程式碼分析,結合上圖: 1. 對同一個檔案描述符的讀和寫位置共享。 測試程式碼: charbuf[128]; intmain(intargc,char*argv[]) { char*s = "test"; intfd = open("test.txt",O_RDWR); if(fd == -1) { perror("open test.txt failure"); exit(EXIT_FAILURE); } intreadNum = read(fd,buf,3); write(fd,s,4); if(-1 == close(fd)) { perror("close failure"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } 測試條件,test.txt檔案的初始內容為123456789 測試結果:程式執行之後test.txt檔案的內容為123test89 分析: 1. 對 test.txt 進行了讀寫開啟 2. 先對test.txt 讀3個位元組,所以此時fd的偏移量應該是3 3. 接著對fd寫4個位元組,根據最終的輸出結果可以知道此時是從偏移量為3的地方開始寫的,所以對於同一個檔案描述符來說,讀寫位置是共享的。 原因分析:因為檔案的偏移量儲存在檔案表項中。read和write都是對同一個fd操作,所以他們共享了相同的檔案偏移量。 2. 同一個程序多次開啟同一個檔案 測試程式碼: intmain(intargc,char*argv[]) { charbuf[10]; char*s = "test"; intfd1 = open("test.txt",O_RDWR); intreadNum = read(fd1,buf,3); intfd2 = open("test.txt",O_RDWR); write(fd2,s,4); } 測試條件,test.txt檔案的初始內容為123456789 測試結果:程式執行之後test.txt檔案的內容為test56789 分析: 1. 對 test.txt 進行了第一次open操作得到fd1 2. 先通過fd1對test.txt 讀3個位元組,所以此時fd1所對應的偏移量應該是3 3. 接著對test.txt進行了第二次open操作,得到了fd2, 4. 通過fd2對test.txxt寫4個位元組,根據最終的輸出結果可以知道此時是從偏移量為0的地方開始寫的 5. 綜上所述,如果對同一個檔案開啟多次,那麼這些檔案描述符所對應的核心結構是獨立的。 6、從上面的結果也可以看出來,即使是同一個檔案,如果我們打開了多次,那麼核心也會維護多個開啟檔案表項。這樣可以讓每個檔案描述符可以擁有獨立的檔案偏移量等。 十六、開啟的檔案數量和檔案描述符的關係 每開啟一個檔案都要為該檔案分配一個檔案描述符。但是我們還可以使用dup()等函式來複制相同的檔案描述符,這樣就會導致有些檔案會對應多個檔案描述符。可能還會有其他的原因,但是至少上面的原因是其中一個。這樣就會造成二者不相同。 我們建立管道的時候使用pipe()呼叫時,一個管道檔案會產生兩個檔案描述符。這個也會造成開啟的檔案數量和獲得的檔案描述符數量不一致。

相關推薦

linux 檔案io常用操作總結

對檔案的操作,究根結底也就是那麼幾種行為,分別為開啟,讀,寫,關閉。 一、檔案描述符:至於什麼是檔案描述符,這個是很簡單的概念。 二、開啟檔案 open(path,flag,...) 1、建立新

檔案IO常用操作—python

1、檔案開啟操作—open open(file, mode=’r’, buffering=-1, encoding=’None’, errors=None, closed=True, opener=None) open操作位開啟一個檔案,並

Linux檔案IO操作常用函式

1.Linux檔案的概念 Linux系統中,一切皆是檔案。無論是鍵盤、滑鼠、顯示屏以及其它裝置,在Linux系統眼中,它們都只是檔案,僅此而已。這就意味著計算機程式可以像使用檔案一樣操控所有的外設。操作檔案(外設)的函式還是比較多的,但是常用的就那麼幾個:open、clos

Linux檔案IO操作

Linux檔案IO操作包括開啟(open),建立(create),讀(read),寫(write) 開啟open int open(const char *path, int oflags); int open(const char *path, int oflag

linux檔案\資料夾操作常用指令

linux檔案\資料夾操作常用指令 資料夾許可權 r–read 讀許可權 w–write 寫許可權 x–execute 執行 d rwx rwx rwx d – 代表檔案型別 : d代表資料夾 ;- 代表普通檔案; c

Linux檔案IO快取總結

檔案IO快取 使用者空間快取(堆)—IO系統呼叫(write等)—核心空間快取記憶體—磁碟 write後立即返回,後續核心將快取區資料寫入磁碟 read從核心快取記憶體中讀取 設計目的:無需等待磁碟操作,減少磁碟操作 大塊快取空間,更少的系統呼叫,提高IO效能

linux下對sh檔案的基本操作總結

1、建立test.sh檔案 touch test.sh 2、編輯sh檔案 vi test.sh 3、儲存退出 敲擊esc, 然後輸入 :wq ,回車退出 4、新增可執行許可權,當然預設就是可執行的。 chmod +x test.sh 5、執行檔

linux檔案系統&磁碟操作常用命令

1. 檢視系統磁碟 fdisk -l fdisk -lu 2.對磁碟進行分割槽 fdisk /dev/sda 3. 分割槽格式化 mkfs.ext2  /de/sda1 4. 掛載裝置 mount  /dev/sda1  /目錄 5.檢視檔案系統掛載情況 mount 6.檢

linux檔案IO底層讀寫操作

1.底層檔案訪問。     執行中的程式成為程序,每個程序都有與之關聯的檔案描述符。     檔案描述符 - 一些小值整數,通過他們訪問開啟的檔案或裝置。開始執行會有三個檔案描述符: 0:   標準輸入   STDIN_FILENO 1:   標準輸出   S

linux下一些常用操作命令

linux 防火墻 端口 1、兩個服務器ssh免授權:ssh-keygen -t rsa 一直回車至結束ssh-copy-id -i /root/.ssh/id_rsa.pub 遠程ip 然後回車 輸入遠程ip密碼搞定,以後訪問就不用驗證密碼了2、壓縮和解壓縮命令: .tar

Linux防火墻常用操作

cmd 生效 規則 tcp logs public 常用 nbsp fire sudo firewall-cmd --permanent --zone=public --add-port=32200/tcp —— 配置白名單 sudo sys

Linux RedHat 7常用命令總結

pri which 工作 技術 文件格式 man 文件名 而不是 “.” Linux RedHat 7常用命令總結、、、 ----------------------- 征服Linux從終端開始 ------------------------------------

linux零基礎學習之Linux sed 命令常用操作詳解

延伸 進行 數據 12px -i 空白 字符串 options 信息 sed是Linux系統中一個很好的文件處理工具,可以對數據進行替換、刪除、新增以及選取等操作,使用起來也十分方面,以下是全面的sed操作介紹。sed命令行格式:sed [options] 'com

Linux 檔案IO

Linux為每個開啟的檔案都返回一個FILE指標,這個FILE指標對應著緩衝指標buffer,指向8192B,這是為了避免頻繁的讀寫,提高讀寫效率。 每次向檔案中寫的資料都是先寫到緩衝區中的,等待以下條件達到後再重新整理緩衝區 重新整理緩衝區的條件 1.   &

JavaScript:對Object物件的一些常用操作總結

JavaScript對Object物件的一些常用操作總結。 一、Object.assign() 1.可以用作物件的複製 var obj = { a: 1 }; var copy = Object.assign({}, obj); console.log(copy); // { a: 1 } 2.可以用

JavaScript:對Object對象的一些常用操作總結

property ons num rop 枚舉 keys 2.3 segment pro JavaScript對Object對象的一些常用操作總結。 一、Object.assign() 1.可以用作對象的復制 var obj = { a: 1 }; var copy = O

Yii2 常用操作總結

時區配置 #common\config\main.php return [ 'timeZone' => 'Asia/Shanghai', ] a標籤 <?= Html::a('Delete', ['delete', 'id' =>$model->id]

漫談linux檔案IO--io流程講的很清楚

這篇文章寫的比較全面,也淺顯易懂,備份下。轉載自:http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 開發中,有幾個關係到效能的東西,技術人員非常關注:程序,CPU,MEM,網路IO,磁碟IO。本篇檔案打算詳細全面,深入

linux檔案及目錄操作

1.建立檔案 touch 檔名 vim 檔名 2.複製檔案 cp 檔名 新路徑名稱 3.移動檔案也可以修改名稱 mv 檔名 新路徑名稱 4.建立資料夾 mkdir 資料夾名稱 5.複製檔案目錄 cp -r 資料夾名稱 新路徑名稱 -r

Linux————less指令常用操作

引言 對於生產環境、測試環境中的日誌檔案,我們可以通過less指令來進行檢視並通過關鍵字進行查詢。 語法 less [引數] 檔案 退出 q 或 Q 或 ZZ   常用操作 /字串 :向下搜尋“字串”