Linux檔案程式設計之 系統呼叫 open

2021-08-26 10:20:11 字數 2857 閱讀 9983

(1) 相關函式說明

函式原型

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

int open( constchar * pathname,int flags, mode_t mode);【如果使用了o_creat標誌,則要使用這個函式,這時需要指定mode來表示檔案的訪問許可權】

相關函式

read,write,fcntl,close,link,stat,umask,unlink,fopen

表頭檔案

#include

#include

#include

引數說明

①引數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_nonblock —— 以不可阻斷的方式開啟檔案,也就是無論有無資料讀取或等待,都會立即返回程序之中。

o_ndelay —— 同o_nonblock。

o_sync —— 以同步的方式開啟檔案。

o_nofollow —— 如果引數pathname 所指的檔案為一符號連線,則會令開啟檔案失敗。

o_directory —— 如果引數pathname 所指的檔案並非為一目錄,則會令開啟檔案失敗。此為linux2.2以後特有的旗標,以避免一些系統安全問題。

③引數mode 則有下列數種組合,只有在建立新檔案時才會生效,此外真正建檔案時的許可權會受到umask值所影響,因此該檔案許可權應該為(mode-umaks)。

s_irwxu —— 00700 許可權,代表該檔案所有者具有可讀、可寫及可執行的許可權。

s_irusr 或s_iread —— 00400許可權,代表該檔案所有者具有可讀取的許可權。

s_iwusr 或s_iwrite —— 00200 許可權,代表該檔案所有者具有可寫入的許可權。

s_ixusr 或s_iexec —— 00100 許可權,代表該檔案所有者具有可執行的許可權。

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 ——訪問錯誤。

附加說明

使用access()作使用者認證方面的判斷要特別小心,例如在access()後再作open()空檔案可能會造成系統安全上的問題。

範例

#include#include#include#includemain()

執行

linux programmer!
(2)例項原始碼file_open.c

#include #include #include #include #include int main(int argc, char *argv)

if( (fd = open(argv[1],o_creat|o_rdwr,0755)) < 0)

else

close(fd);

exit(0);

}

(3)除錯結果

Linux檔案程式設計之 系統呼叫 close

1 相關函式說明 相關函式 open,fcntl,shutdown,unlink,fclose 表頭檔案 include 定義函式 int close intfd 引數說明 引數fd為先前由open 或creat 所返回的檔案描述詞。當使用完檔案後若已不再需要則可使用close 關閉該檔案,而clo...

Linux檔案程式設計之 系統呼叫 read

1 相關函式說明 函式原型 int read int fd,void buf size t count 相關函式 readdir,write,fcntl,close,lseek,readlink,fread 表頭檔案 include 函式說明 從檔案描述符fd所指定的檔案中,讀取count個位元組,...

Linux檔案程式設計之 系統呼叫 write

1 相關函式說明 函式原型 int write int fd,const void buf,size t count 相關函式 open,read,fcntl,close,lseek,sync,fsync,fwrite 表頭檔案 include 函式說明 從buf所指向的緩衝區中,取出count個位...