C 中常用函式copy from

2022-09-24 17:21:18 字數 3909 閱讀 5115

目錄

函式定義:

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 ...