目錄
函式定義:
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
引數說明:
pathname :檔案的名稱,可以包含(絕對和相對)路徑
flags:檔案開啟模式
mode: 用來規定對該檔案的所有者,檔案的使用者組及系統中其他使用者的訪問許可權,則檔案許可權為:mode&(~umask)
函式說明:
引數pathname 指向欲開啟的檔案路徑字串。下列是引數flags 所能使用的旗標:
o_rdonly 以唯讀方式開啟檔案;
o_wronly 以只寫方式開啟檔案;
o_rdwr 以可讀寫方式開啟檔案;
上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用or(|)運算子組合;
o_creat 若欲開啟的檔案不存在則自動建立該檔案;
o_excl 如果o_creat也被設定,此指令會去檢查檔案是否存在。檔案若不存在則建立該檔案,否則將導致開啟檔案錯誤,此外,若o_creat與o_excl同時設定,並且欲開啟的檔案為符號連線,則會開啟檔案失敗。
o_noctty 如果欲開啟的檔案為終端機裝置時,則不會將該終端機當成程序控制終端機;
o_trunc 若檔案存在並且以可寫的方式開啟時,此旗標會令檔案長度清為0,而原來存於該檔案的資料也會消失;
o_append 當讀寫檔案時會從檔案尾開始移動,也就是所寫入的資料會以附加的方式加入到檔案後面;
o_nonblock 以不可阻斷的方式開啟檔案,也就是無論有無資料讀取或等待,都會立即返回程序之中;
o_ndelay 同o_nonblock;
o_sync 以同步的方式開啟檔案;
o_nofollow 如果引數pathname 所指的檔案為一符號連線,則會令開啟檔案失敗;
o_directory 如果引數pathname 所指的檔案並非為一目錄,則會令開啟檔案失敗。
此為linux2.2以後特有的旗標,以避免一些系統安全問題。引數mode 則有下列數種組合,只有在建立新檔案時才會生效,此外真正建檔案時的許可權會受到umask值所影響,因此該檔案許可權應該為(mode-umaks)。
s_irwxu00700 許可權,代表該檔案所有者具有可讀、可寫及可執行的許可權;
s_irusr 或s_iread,00400許可權,代表該檔案所有者具有可讀取的許可權;
**s_iwusr 或s_iwrite,00200 **許可權,代表該檔案所有者具有可寫入的許可權;
程式設計客棧s_ixusr 或s_iexec,00100 許可權,代表該檔案所有者具有可執行的tlhmoffiq許可權;
s_irwxg 00070許可權,代表該檔案使用者組具有可讀、可寫及可執行的許可權;
s_irgrp 00040 許可權,代表該檔案使用者組具有可讀的許可權;
s_iwgrp 00020許可權,代表該檔案使用者組具有可寫入的許可權;
s_ixgrp 00010 許可權,代表該檔案使用者組具有可執行的許可權;
s_irwxo 00007許可權,代表其他使用者具有可讀、可寫及可執行的許可權;
s_iroth 00004 許可權,代表其他使用者具有可讀的許可權;
s_iwoth 00002許可權,代表其他使用者具有可寫入的許可權;
s_ixoth 00001 許可權,代表其他使用者具有可執行的許可權。
返回值:
若所有欲核查的許可權都通過了檢查則返回0值,表示成功,只要有乙個許可權被禁止則返回-1。
錯誤**:
eexist 引數pathname 所指的檔案已存在,卻使用了o_creat和o_excl旗標;
eaccess 引數pathname所指的檔案不符合所要求測試的許可權;
erofs 欲測試寫入許可權的檔案存在於唯讀檔案系統內;
efault 引數pathname指標超出可訪問記憶體空間;
einval 引數mode 不正確;
enametoolong 引數pathname太長;
enotdir 引數pathname不是目;
enomem 核心記憶體不足;
eloop 引數pathname有過多符號連線問題;
eio i/o 訪問錯誤。
#include
#include
#include
#include
main()
函式定義:
ssize_t read(int fd, void * buf, size_t count);
函式說明:
read()會把引數fd所指的檔案傳送count 個位元組到buf 指標所指的記憶體中。
返回值:
返回值為實際讀取到的位元組數, 如果返回0, 表示已到達檔案尾或是無可讀取的資料。若引數count 為0, 則read()不會有作用並返回0。
注意:read時fd中的資料如果小於要讀取的資料,就會引起阻塞。
read的用法比write較為簡單,此處不敘述過多。由於筆者水平也有限,如果文中有謬誤之處還懇請諸位指出,以免誤導大家。
函式定義:
ssize_t write (int fd, const void * buf, size_t count);
函式說明:
write()會把引數buf所指的記憶體寫入count個位元組到引數放到所指的檔案內。
返回值:
如果順利write()會返回實際寫入的位元組數。當有錯誤發生時則返回-1,錯誤**存tlhmoffiq入errno中。
(1)write()函式返回值一般無0,只有當如下情況發生時才會返回0:write(fp, p1+len, (strlen(p1)-len)中第三引數為0,此時write()什麼也不做,只返回0。man手冊給出的write()返回值的說明如下:
(2)write()函式從buf寫資料到fd中時,若buf中資料無法一次性讀完,那麼第二次讀buf中資料時,其讀位置指標(也就是第二個引數buf)不會自動移動,需要程式設計師程式設計控制
而不是簡單的將buf首位址填入第二引數即可。如可按如下格式實現讀位置移動:write(fp, p1+len, (strlen(p1)-len)。 這樣write第二次迴圈時變會從p1+len處寫資料到fp, 之後的也
由此類推,直至(strlen(p1)-len變為0。
以下通過乙個例子具體說明write函式用法:
#include
#include
#include
int main()
len+=n;
} return 0;
}(3)在write一次可以寫的最大資料範圍內(貌似是bufsiz ,8192),第三引數count大小最好為buf中資料的大小,以免出現錯誤。(經過筆者再次試驗,write一次能夠寫入的並不只有8192這麼多,筆者嘗試一次寫入81920000,結果也是可以,看來其一次最大寫入資料並不是8192,但核心中確實有bufsiz這個引數,具體指什麼還有待研究)
函式定義:
unsi程式設計客棧gned long copy_to_user(void *to, const void *from, unsigned long n)
引數說明:
to:目標位址(使用者空間)
from:源位址(核心空間)
n:將要拷貝資料的位元組數
函式說明:
從核心空間中讀取資料到使用者空間
返回值:
成功返回0,失敗返回沒有拷貝成功的資料位元組數
函式定義:
unsigned long copy_from_user(void *to, const void *from, unsigned long n);
引數說明:
to:目標位址(核心空間)
from:源位址(使用者空間)
n:將要拷貝資料的位元組數
函式說明:
從使用者空間中讀取資料到核心空間
返回值:
成功返回0,失敗返回沒有拷貝成功的資料位元組數
C 中常用數學函式
include using abs 絕對值 using acos 反余弦 using acosf 反余弦 using acosl 反余弦 using asin 反正弦 using asinf 反正弦 using asinl 反正弦 using atan 反正切 using atan2 y x的反正切...
C 中常用函式記錄
發現很多常見功能都已經封裝實現 每次卻還自己吭吭的寫,費力不討好。故在此記錄。函式名 功能描述 sort 對給定區間所有元素進行排序 stable sort 對給定區間所有元素進行穩定排序 partial sort 對給定區間所有元素部分排序 partial sort copy 對給定區間複製並排序...
c 中常用的庫函式
很多呢。怎麼跟你說啊。把最常用給你貼出來,看看吧 標準 c include stl 通用演算法 include stl 位集容器 include include include 定義本地化函式 include 定義數學函式 include 複數類 include 定義輸入 輸出函式 include ...