亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人


底層文件I/O操作的系統調用

分享到:
           

    文件I/O操作的系統調用,主要用到5個函數:open()、read()、write()、lseek()和close()。這些函數的特點是不帶緩存,直接對文件(包括設備)進行讀寫操作。這些函數雖然不是ANSI C的組成部分,但是是Posix的組成部分。

    基本文件操作

    1.函數說明
    ● open()函數用于打開或創建文件,在打開或創建文件時可以指定文件的屬性及用戶的權限等各種參數。
    ● close()函數用于關閉一個被打開的文件。當一個進程終止時,所有被它打開的文件都由內核自動關閉,很多程序都使用這一功能而不顯式地關閉一個文件。
    ● read()函數用于將從指定的文件描述符中讀出的數據放到緩存區中,并返回實際讀入的字節數。若返回0,則表示沒有數據可讀,即已達到文件尾。讀操作從文件的當前指針位置開始。當從終端設備文件中讀出數據時,通常一次多讀一行。
    ● write()函數用于向打開的文件寫數據,寫操作從文件的當前指針位置開始,對磁盤文件進行寫操作,若磁盤已滿或超出該文件的長度,則write()函數返回失敗。
    ● lseek()函數用于在指定的文件描述符中將文件指針定位到相應的位置。它只能用在可定位(可隨機訪問)文件操作中。管道、套接字和大部分字符設備文件是不可定位的,所以在這些文件的操作中無法使用lseek()調用。

    2.函數格式

    open()函數的語法要點如表2.1所示。

表2.1 open()函數語法要點

所需頭文件 #include <sys/types.h> /* 提供類型pid_t的定義 */
#include <sys/stat.h>
#include <fcntl.h>
函數原型 int open(const char *pathname, int flags, int perms)
函數傳入值 pathname 被打開的文件名(可包括路徑名)
flag:文件打開的方式 O_RDONLY:以只讀方式打開文件
O_WRONLY:以只寫方式打開文件
O_RDWR:以讀/寫方式打開文件
O_CREAT:如果該文件不存在,就創建一個新的文件,并用第三個參數為其設置權限
O_EXCL:如果使用O_CREAT時文件存在,則可返回錯誤消息。這一參數可測試文件是否存在。此時open是原子操作,防止多個進程同時創建同一個文件
O_NOCTTY:使用本參數時,若文件為終端,那么該終端不會成為調用open()的那個進程的控制終端
O_TRUNC:若文件已經存在,那么會刪除文件中的全部原有數據,并且設置文件大小為0
O_APPEND:以添加方式打開文件,在打開文件的同時,文件指針指向文件的末尾,即將寫入的數據添加到文件的末尾
perms 被打開文件的存取權限
可以用一組宏定義:S_I(R/W/X)(USR/GRP/OTH)
其中R/W/X分別表示讀/寫/執行權限
USR/GRP/OTH分別表示文件所有者/文件所屬組/其他用戶
例如,S_IRUSR | S_IWUSR表示設置文件所有者的可讀可寫屬性,八進制表示法中0600也表示同樣的權限
函數返回值 成功:返回文件描述符
失敗:-1

    在open()函數中,flag參數可通過“|”組合構成,但前3個標志常量(O_RDONLY、O_WRONLY及O_RDWR)不能相互組合。perms是文件的存取權限,既可以用宏定義表示法,也可以用八進制表示法。

    close()函數的語法要點如表2.2所示。

表2.2 close()函數語法要點

所需頭文件 #include <unistd.h>
函數原型 int close(int fd)
函數輸入值 fd:文件描述符
函數返回值 0:成功
1:出錯

    read()函數的語法要點如表2.3所示。

表2.3 read()函數語法要點

所需頭文件 #include <unistd.h>
函數原型 ssize_t read(int fd, void *buf, size_t count)
函數傳入值 fd:文件描述符
buf:指定存儲器讀出數據的緩沖區
count:指定讀出的字節數
函數返回值 成功:讀到的字節數
0:已到達文件尾
1:出錯

    在讀普通文件時,若讀到要求的字節數前已到達文件的尾部,則返回的字節數會小于希望讀出的字節數。

    write()函數的語法要點如表2.4所示。

表2.4 write()函數語法要點

所需頭文件 #include <unistd.h>
函數原型 ssize_t write(int fd, void *buf, size_t count)
函數傳入值 fd:文件描述符
buf:指定存儲器寫入數據的緩沖區
count:指定讀出的字節數
函數返回值 成功:已寫的字節數
1:出錯

    在寫普通文件時,寫操作從文件的當前指針位置開始。

    lseek()函數的語法要點如表2.5所示。

表2.5 lseek()函數語法要點

所需頭文件 #include <unistd.h>
#include <sys/types.h>
函數原型 off_t lseek(int fd, off_t offset, int whence)
函數傳入值 fd:文件描述符
offset:偏移量,每一讀寫操作所需要移動的距離,單位是字節,可正可負(向前移,向后移)
whence:
當前位置的基點
SEEK_SET:當前位置為文件的開頭,新位置為偏移量的大小
SEEK_CUR:當前位置為文件指針的位置,新位置為當前位置加上偏移量
SEEK_END:當前位置為文件的結尾,新位置為文件的大小加上偏移量的大小
函數返回值 成功:文件的當前位移
1:出錯

    3.函數使用實例

    下面實例中的open()函數帶有3個flag參數:O_CREAT、O_TRUNC和O_WRONLY,這樣就可以對不同的情況指定相應的處理方法。另外,這里對該文件的權限設置為0600。其源碼如下所示:

    下面列出文件基本操作的實例,基本功能是從一個文件(源文件)中讀取后10KB數據并復制到另一個文件(目標文件)。在實例中源文件是以只讀方式打開的,目標文件是以只寫方式打開(可以是讀/寫方式)的。若目標文件不存在,可以創建并設置權限的初始值為644,即文件所有者可讀可寫,文件所屬組和其他用戶只能讀。

    讀者需要留意的地方是改變每次讀/寫的緩存大小(實例中為1KB)會怎樣影響運行效率。

    /* copy_file.c */
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <stdio.h>

    #define BUFFER_SIZE 1024 /* 每次讀/寫緩存大小,影響運行效率 */
    #define SRC_FILE_NAME "src_file" /* 源文件名 */
    #define DEST_FILE_NAME "dest_file" /* 目標文件名 */
    #define OFFSET 10240 /* 復制的數據大小 */

    int main()
    {
        int src_file, dest_file;
        unsigned char buff[BUFFER_SIZE];
        int real_read_len;

        /* 以只讀方式打開源文件 */
        src_file = open(SRC_FILE_NAME, O_RDONLY);

        /* 以只寫方式打開目標文件,若此文件不存在則創建該文件, 訪問權限值為644 */
        dest_file = open(DEST_FILE_NAME, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|
        S_IRGRP|S_IROTH);
        if (src_file < 0 || dest_file < 0)
        {
            printf("Open file error\n");
            exit(1);
        }

        /* 將源文件的讀/寫指針移到后10KB的起始位置 */
        lseek(src_file, -OFFSET, SEEK_END);

        /* 讀取源文件的后10KB數據并寫到目標文件中,每次讀寫1KB */
        while ((real_read_len = read(src_file, buff, sizeof(buff))) > 0)
        {
            write(dest_file, buff, real_read_len);
        }
        close(dest_file);
        close(src_file);
        return 0;
    }

    $ ./copy_file
    $ ls -lh dest_file
    -rw-r--r-- 1 david root 10K 14:06 dest_file

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱點鏈接:

   1、Linux系統調用及用戶編程接口(API)
   2、什么是Linux系統調用,包括哪些內容
   3、Linux中的文件及文件描述符
   4、Linux文件系統之虛擬文件系統(VFS)
   5、嵌入式文件系統構建

更多新聞>> 

主站蜘蛛池模板: 国产成人99精品免费视频麻豆 | 99精品一区二区免费视频 | 久久中文字幕久久久久91 | 国产国产成人久久精品杨幂 | 国产欧美第一页 | 久久国产影院 | 97在线碰 | 在线a人片天堂免费观看高清 | 日本不卡高清 | 国产a级特黄的片子视频 | jizzjizz强| 欧美性f| 国产欧美在线视频免费 | 99视频这里有精品 | 亚洲在成人网在线看 | 黄色一级片在线免费观看 | 欧美成人丝袜videos | 精品成人乱色一区二区 | 果冻文化传媒一区 | 亚洲日本在线观看视频 | 欧美色臀 | 国产高清在线 | 久草网址 | 日韩精品手机在线 | 日韩在线欧美高清一区 | 免费操人视频 | 三级大片免费看 | 日本午色www高清视频 | 99在线精品免费视频 | 日日日干| 久久精品国产久精国产80cm | 欧美最猛性xxxx69交 | 一级毛片真人免费观看 | 久久国产热 | 欧美性xxxxx极品视频 | 国产精品999 | 国产精品亚洲综合五月天 | 欧美一区二区三区四区视频 | 国产三级日本三级在线播放 | www.亚洲成人.com| 欧美亚洲国产精品久久 |