LINUX打開文件


基於文件描述符的文件操作(非緩沖)

1、文件描述符
內核為每個進程維護一個已打開文件的記錄表,文件描述符是一個較小的正整數(0—1023),它代表記錄表的一項,通過文件描述符和一組基於文件描述符的文件操作函數,就可以實現對文件的讀、寫、創建、刪除等操作。常用基於文件描述符的函數有 open(打開) 、creat(創建)、close(關閉)read(讀取)write(寫入)、ftruncate(改變文件大小)、lseek(定位)、fsync(同步)、fstat(獲取文件狀態)、fchmod(權限)、flock(加鎖)、fcntl(控制文件屬性)、dup(復制)、dup2、select和ioctl。基於文件描述符的文件操作並非ANSI C的函數,是LINUX獨有的東西。

如果不清楚某個函數的具體實現形式,可以通過下面的方式查詢
man  函數名  查看該函數的幫助
2、打開、創建和關閉文件

open和creat都能打開和創建函數,原型為

#include <sys/types.h>      //頭文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);                 //文件名  打開方式
int open(const char *pathname, int flags, mode_t mode);    //文件名  打開方式  權限,open()函數出錯時返回-1
int creat(const char *pathname, mode_t mode);              //文件名  權限   //現在已經不常用了(因為有上面的函數)
creat函數等價於→open(pathname,O_CREAT|O_TRUNC|O_WRONLY,mode);

flags和mode都是一組掩碼的合成值,flags表示打開或創建的方式, 必須加上打開方式 ,mode表示文件的訪問權限。

flags
的可選項有:
掩碼 含義
O_RDONLY 只讀的方式打開
O_WRONLY 方式打開
O_RDWR 讀寫的方式打開
O_CREAT 如果文件不存在,則創建文件
O_EXCL 僅與O_CREAT連用,如果文件已存在,則強制open失敗
O_TRUNC 如果文件存在,將文件的長度截至0
O_APPEND 追加的方式打開文件每次調用write時,文件指針自動先移到文件尾,用於多進程寫同一個文件的情況。
O_NONBLOCK 非阻塞方式打開,無論有無數據讀取或等待,都會立即返回進程之中。
O_NODELAY 非阻塞方式打開
O_SYNC 同步打開文件,只有在數據被真正寫入物理設備設備后才返回

mode
的可選項有:
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 權限,代表其他用戶具有可執行的權限。
但是通常采用 直接賦數值 的形式,如:
int fd=open(argv[1],O_CREAT|O_RDONLY,0666);
注意:LINUX中基於文件描述符的 open 函數,對於一個不存在的文件,不能通過 O_WRONLY 的方式打開,必須加上 O_CREAT 選項。

close用於文件的關閉:
int close(int fd); //fd表示文件描述詞,是先前由open或creat創建文件時的返回值
文件使用完畢后,應該調用close關閉它, 一旦調用close,則該進程對文件所加的鎖全都被釋放,並且使文件的打開引用計數減1,只有文件的打開引用計數變為0以后,文件才會被真正的關閉

//o_creat.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char ** argv)
{
        int fd = open(argv[1],O_CREAT|O_RDONLY,0666);
        printf("ret = %d\n",ret);
        close(fd);
        return 0;
}

//(創建文件默認減去掩碼0002)

open 函數中的fiags (O_RDWR|O_CREAT|O_EXCL)表示在創建文件時不確定系統有沒有人創建過這個文件,就加上O_EXCL,表示如果系統存在相應文件就強制失敗



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM