03 系統呼叫方式檔案程式設計

2021-07-30 09:35:01 字數 4142 閱讀 5362

上篇文章提到,linux應用程式設計中需要的外部函式主要由函式庫(標c及其拓展)和系統呼叫(posix及其拓展)來提供。

本篇就通過例項,講解通過「系統呼叫」(glibc呼叫linux核心的函式)來實現檔案程式設計。

命令格式:

man number function這個是檢視函式的命令

number的取值:

1、standard commands (標準命令)

2、system calls (系統呼叫)

3、library functions (庫函式)

4、special devices (裝置說明)

5、file formats (檔案格式)

6、games and toys (遊戲和娛樂)

7、miscellaneous (雜項)

8、administrative commands (管理員命令)

9 其他(linux特定的), 用來存放核心例行程式的文件

命令示例:

例子:

man ls檢視linux標準命令ls的說明

man 2 open檢視linux核心的函式open的說明

man 3 open檢視使用者態的庫函式open的說明,這使用者態的函式都是基於linux函式寫的

檢視函式命令:man 2 函式名

開啟檔案:open

函式原形

int open(const char *pathname,int flags,int perms)

函式功能

用於開啟或建立檔案,在開啟或建立檔案時可以指定檔案的屬性及使用者的許可權等各種引數

標頭檔案#include《sys/types.h》

#include 《sys/stat.h》

#include 《fcntl.h》

返回值成功:返回檔案描述符;

失敗:返回-1

引數說明

pathname

被開啟的檔名(可包括路徑名如」dev/ttys0」)

flags

檔案開啟方式;

o_rdonly:以唯讀方式開啟檔案;

o_wronly:以只寫方式開啟檔案;

o_rdwr:以讀寫方式開啟檔案;

o_creat:如果改檔案不存在,就建立乙個新的檔案,並用第三個引數為其設定許可權;

o_excl:如果使用o_creat時檔案存在,則返回錯誤訊息。這一引數可測試檔案是否存在。此時open是原子操作,防止多個程序同時建立同乙個檔案;

o_nonblock: 如果pathname指的是乙個fifo、乙個塊特殊檔案或乙個字元特殊檔案,則此選擇項為此檔案的本次開啟操作和後續的i/o操作設定非阻塞方式;

o_sync:使每次write都等到物理i/o操作完成;

o_rsync:read 等待所有寫入同一區域的寫操作完成後再進行 在open()函式中,falgs引數可以通過「|」組合構成,但前3個標準常量

(o_rdonly,o_wronly,和o_rdwr)不能互相組合;

perms

被開啟檔案的訪問許可權,可以用兩種方法表示,可以用一組巨集定義;s_i(r/w/x)(usr/grp/oth),其中r/w/x表示讀寫執行許可權,usr/grp/oth分別表示檔案的所有者/檔案所屬組/其他使用者,如s_iruur|s_iwuur|s_ixuur,(-rex——),也可用八進位制800表示同樣的許可權

建立檔案:create

函式功能:

建立乙個檔案,並以字寫的方式開啟;

函式標頭檔案:

p>#include《sys/types.h》#include 《sys/stat.h》

#include 《fcntl.h》

函式原型:

int creat( const char *pathname,mode_t mode) ;

函式引數:

pathname:開啟檔案的路徑名,如:/home/nan/test.c;

mode:建立檔案的許可權;

函式返回值:

成功:返回檔案描述符;

失敗:返回-1

關閉檔案:close

函式功能:

關閉乙個開啟的檔案;

函式標頭檔案:

#include 《unistd.h》

函式原型:

int close( int fd ) ;

函式引數:

fd:待關閉的檔案描述符;

函式返回值:

成功:返回0;

失敗:返回-1

讀檔案:read

函式功能:

從乙個開啟的檔案中讀取資料;

函式標頭檔案:

#include 《unistd.h》

函式原型:

ssize_t read( int fd , void *buf , size_t count ) ;

函式引數:

fd:想要讀取資料的檔案描述符;

buf:希望將讀取的資料存放的位置;

count:希望讀取的位元組數

函式返回值:

成功:讀取的位元組數;

失敗:返回-1

寫檔案:write

函式功能:

往乙個開啟的檔案中寫入資料;

函式標頭檔案:

#include 《unistd.h》

函式原型:

ssize_t write(int fd , const void *buf , size_t count) ;

函式引數:

fd:希望寫入資料的檔案描述符;

buf:希望寫入檔案的資料;

count:希望寫入資料的位元組數;

函式返回值:

成功:寫入資料的位元組數;

失敗:返回-1

定位檔案:lseek

函式功能:

重新定位檔案 的讀寫位置;

函式標頭檔案:

#include 《unistd.h》

#include 《sys/types.h》

函式原型:

off_t lseek(int fd , off_t offset , int whence ) ;

函式引數:

fd:希望重定位的檔案描述符;

offset:根據第三個引數whence指定的檔案指標位置來移動的位元組數;

whence:檔案指標從什麼位置開始移動;seek_set:檔案的開頭位置指標; seek_cur:檔案指標的當前位置; seek_end:檔案的末尾指標;

函式返回值:

成功:返回當前的檔案指標距離檔案頭的位置;

失敗:返回-1

複製檔案描述符 :dup

函式功能:

複製乙個檔案描述符;

函式標頭檔案:

#include 《unistd.h》

函式原型:

int dup(int oldfd) ;int dup2(int oldfd , int newfd) ;

int dup3(int oldfd , int newfd , int flags) ;

函式引數:

oldfd:待複製的檔案描述符;

函式返回值:

成功:返回新的檔案描述符;

失敗:返回-1

功能:複製乙個檔案。

#include 

#include

#include

#include

int main( int argc , char **argv ) ;

int count ;

if( 0 > fd_f || 0 > fd_t )

return -1 ;

while( 0

<(count=read(fd_f,buf,512)) )

close( fd_f ) ;

close( fd_t ) ;

return

0 ;}

2 8 系統呼叫方式的檔案程式設計

1.基本理論 在linux中,所有開啟的檔案對應乙個數字,該數字由系統自動分配,稱為檔案描述符。2.檔案操作 2.1 開啟檔案 函式名 open 函式原型 int open const char pathname,int flags int open const char pathname,int ...

03系統呼叫

1 系統呼叫的作用 系統呼叫是使用者空間訪問核心的唯一手段,除異常和陷入外,它們是核心唯一的合法入口。系統呼叫在使用者空間程序和硬體裝置之間新增了乙個中間層。它有三個作用 2 api posix和c庫的關係 一般應用程式通過使用者空間實現的應用程式設計介面 api 而不是直接通過系統呼叫來程式設計。...

系統呼叫方式訪問檔案

linux 系統中訪問檔案的方法 1.linux 系統呼叫 2.基於 c語言的訪問 系統呼叫 建立 int creat const char filename,mode t mode filename 要建立的檔名 包含路徑,預設為當前路徑 mode 建立模式 常見建立模式 s irusr 可讀 s...