歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux中無緩沖文件I/O API

Linux中無緩沖文件I/O API

日期:2017/3/1 10:01:38   编辑:Linux編程

1.什麼是無緩沖I/O
 我們首先要知道Linux操作系統提供給我們的用戶程序調用的接口,除了使用庫函數,還可以直接使用系統調用。而今天我要介紹的相關函數就是直接調用了內核的系統調用,所以說它是無緩沖的,它跟標准的I/O函數相對應。

2.打開或者創建文件的函數:open()
 
要操作相關文件,就必須獲得該文件的句柄,專業點叫文件描述符。它是進程在打開一個文件或者創建一個文件時,內核返回給該進程的一個唯一的非負的整數,且一定是當前可以的描述符中最小的一個數。進程獲得這個文件描述符後,就可以根據它來告訴read()或者write相關函數具體來操作哪個文件了。

Tips:通常系統對一個進程可打開的文件描述符數量有一個默認值,可以使用命令ulimit -f查看,也可以使用ulimit命令重新設置該值。

 通常,系統有3個已經默認的文件描述符,即0代表標准輸入,1表示標准輸出,2表示標准錯誤,在unistd.h頭文件中,把他們定義為常量,分別是STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。

open()函數為我們提供了該文件描述符:

#include<fcntl.h>
int open( constchar* pathname,int flags, mode_t mode);

pathname:即是我們要打開或者創建文件的名字,可以是相對路徑,也可以是絕對路徑。

flags:重點介紹一下,它的取值比較多,在<fcntl.h>頭文件中定義了很多常量:

O_RDONLY:即以只讀的方式打開該文件。
O_WRONLY:即以只寫的方式打開該文件。
O_RDWR:即以讀、寫的方式打開該文件。
以上這三個常量,flags必選選擇其一,且只能選擇其一。還有幾個可選常量可以跟這三個之一組合使用,以達到不同的效果:
O_CREAT:若欲打開的文件不存在則自動建立該文件.
O_TRUNC :若文件存在並且以可寫的方式打開時,此旗標會令文件長度清為0,而原來存於該文件的資料也會消失。
O_APPEND :當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件後面。
O_EXCL 如果O_CREAT 也被設置,此指令會去檢查文件是否存在。文件若不存在則建立該文件,否則將導致打開文件錯誤。

比如,我們可以使用open("./filename" ,O_WRONLY|O_CREAT,mode),以寫方式打開filename,如果filenam不存在則創建它。
再如,open("./filename" ,O_WRONLY|TRUNC),就會將原來filename中的內容清除掉,從新寫入新的值。
還如,open("./filename" ,O_WRONLY|O_CREAT|O_EXCL),可以測試filename是否存在,存在則報錯,不存在則創建filename.
當然flags還有幾個其他的常量取值,就不一一介紹了,可以自己去查手冊。

mode:僅當創建一個新文件需要指定該參數,該參數的意思是說文件以一個什麼樣的權限創建。

open()調用成功後將返回文件描述符,出錯則返回-1。

系統還提供一個專門用來創建文件的函數create():

#include<fcntl.h>
int creat(constchar* pathname, mode_tmode);

其相當於open("pathname",O_WRONLY|O_CREAT|O_TRUNC,mode)。該函數有個不好之處是,只能以寫的方式打開文件。有了open(),我們可以這樣定義:

open("pathname",O_RDWR|O_CREAT|O_TRUNC,mode)

Copyright © Linux教程網 All Rights Reserved