新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > linux基礎復習(6)文件I/O操作

        linux基礎復習(6)文件I/O操作

        作者: 時間:2016-10-08 來源:網絡 收藏

        不帶緩存的文件I/O 操作,主要用到5 個函數:open、read、write、lseek和close。這里的不帶緩存是指每一個函數都只調用系統中的一個函數(不理解這句話的含義)。這些函數雖然不是ANSI C的組成部分,但是是POSIX 的組成部分。

        本文引用地址:http://www.104case.com/article/201610/305800.htm

        open函數語法要點

        |-- #i nclude // 提供類型pid_t的定義

        所需頭文件----|-- #i nclude

        |-- #i nclude

        函數原型 int open(const char *pathname,flags,int perms)

        pathname 被打開的文件名(可包括路徑名)

        O_RDONLY:只讀方式打開文件

        O_WRONLY:可寫方式打開文件

        O_RDWR:讀寫方式打開文件

        O_CREAT:如果該文件不存在,就創建一個新的文件,并用第三個參數為其設置權限

        O_EXCL:如果使用O_CREAT時文件存在,則可返回錯誤消息。這一

        函數傳入值 參數可測試文件是否存在

        O_NOCTTY:使用本參數時,如文件為終端

        終端不可用open()系統調用的那個進程的控制終端

        O_TRUNC:如文件已經存在,并且以只讀或只寫成功打開,那么會先

        全部刪除文件中原有數據

        O+APPEND:以添加方式打開文件,在打開文件的同時,文件指針指

        向文件的末尾

        perms 被打開文件的存取權限,為8進制表示法

        函數返回值 成功:返回文件描述符

        失敗:-1

        補述:文件描述符

        對于Linux 而言,所有對設備和文件的操作都使用文件描述符來進行的。文件描述符

        是一個非負的整數,它是一個索引值,并指向內核中每個進程打開文件的記錄表。當打開一

        個現存文件或創建一個新文件時,內核就向進程返回一個文件描述符;當需要讀寫文件時,

        也需要把文件描述符作為參數傳遞給相應的函數。

        通常,一個進程啟動時,都會打開3 個文件:標準輸入、標準輸出和標準出錯處理。這

        3 個文件分別對應文件描述符為0、1 和2(也就是宏替換STDIN_FILENO、STDOUT_FILENO

        和STDERR_FILENO)。

        基于文件描述符的I/O 操作雖然不能移植到類Linux 以外的系統上去(如Windows),但它

        往往是實現某些I/O操作的惟一途徑,如Linux中低級文件操作函數、多路I/O、TCP/IP套接字

        編程接口等。同時,它們也很好地兼容POSIX標準,因此,可以很方便地移植到任何POSIX平

        臺上。基于文件描述符的I/O操作是Linux中最常用的操作之一。

        read函數語法要點

        所需頭文件 #i nclude

        函數原型 ssize_t read(int fd,void *buf,size_t count)

        fd:文件描述符

        函數傳入值 buf:指定存儲器讀出數據的緩函數傳入值 沖區

        count:指定讀出的字節數

        成功:讀到的字節數

        函數返回值 0:已到達文件尾

        -1:出錯

        write函數語法要點

        所需頭文件 #i nclude

        函數原型 ssize_t write(int fd,void *buf,size_t count)

        fd:文件描述符

        函數傳入值 buf:指定存儲器寫入數據的緩函數傳入值 沖區

        count:指定讀出的字節數

        函數返回值 成功:已寫的字節數

        -1:出錯

        lseek函數語法要點

        所需頭文件 #i nclude

        #i nclude

        函數原型 off_t lseek(int fd,off_t offset,int whence)

        fd:文件描述符

        函數傳入值 offset:偏移量,每一讀寫操作所需要移動的距離

        單位是字節的數量,可正可負(向前移,向后移)

        whence: SEEK_SET:當前位置為文件的開頭,新位置為偏移量的大小

        當前位置 SEEK_CUR:當前位置為文件指針的位置,新位置為當前位置加上偏移

        的基點 SEEK_END:當前位置為文件的結尾,新位置為文件的大小加上偏移

        函數返回值 成功:文件的當前位移

        -1:出錯

        /*打開,關閉,讀寫文件.c*/

        #i nclude unistd.h>

        #i nclude sys/types.h>

        #i nclude sys/stat.h>

        #i nclude fcntl.h>

        #i nclude stdlib.h>

        #i nclude stdio.h>

        int main(void)

        {

        int fd; //文件描述符

        int i,size,len;

        char *buf=Writing to this file!;

        char buf_r[10];

        len = strlen(buf);

        /*調用open函數,以可讀寫的方式打開,注意選項可以用“|”符號連接*/

        if((fd = open(/tmp/hello.c, O_CREAT | O_TRUNC | O_WRONLY , 0600 ))0){

        perror(open:);

        exit(1);

        }

        else{

        printf(Open file: hello.c %dn,fd);

        }

        /*調用write函數,將buf中的內容寫入到打開的文件中*/

        if((size = write( fd, buf, len)) 0){

        perror(write:);

        exit(1);

        }

        else

        printf(Write:%sn,buf);

        /*調用lsseek函數將文件指針移到文件起始,并讀出文件中的10個字節*/

        lseek( fd, 0, SEEK_SET );

        if((size = read( fd, buf_r, 10))0){

        perror(read:);

        exit(1);

        }

        else

        printf(read form file:%sn,buf_r);

        if( close(fd) 0 ){

        perror(close:);

        exit(1);

        }

        else

        printf(Close hello.cn);

        exit(0);

        }

        當多個用戶共同使用、操作一個文件的情況,這時,Linux 通常采用的方法是給文件上鎖,來避免共享的資源產生競爭的狀態。

        文件鎖包括建議性鎖和強制性鎖。建議性鎖要求每個上鎖文件的進程都要檢查是否有鎖存在,并且尊重已有的鎖。在一般情況下,內核和系統都不使用建議性鎖。強制性鎖是由內核執行的鎖,當一個文件被上鎖進行寫入操作的時候,內核將阻止其他任何文件對其進行讀寫操作。采用強制性鎖對性能的影響很大,每次讀寫操作都必須檢查是否有鎖存在。在Linux 中,實現文件上鎖的函數有lock和fcntl,其中flock用于對文件施加建議性鎖,而fcntl不僅可以施加建議性鎖,還可以施加強制鎖。同時,fcntl還能對文件的某一記錄進行


        上一頁 1 2 3 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 治县。| 台东市| 北海市| 正镶白旗| 科技| 张家界市| 河北区| 利津县| 盐亭县| 米林县| 盖州市| 泰兴市| 巴林左旗| 阿坝县| 修武县| 玉林市| 当阳市| 南城县| 清流县| 通许县| 舒城县| 新疆| 拉萨市| 静宁县| 株洲县| 锦州市| 辰溪县| 正镶白旗| 工布江达县| 宜都市| 和硕县| 莒南县| 明星| 彭泽县| 五华县| 自治县| 龙胜| 新竹县| 长春市| 宁波市| 闽侯县|