IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育


底層文件I/O操作的系統(tǒng)調(diào)用

分享到:
           

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

    基本文件操作

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

    2.函數(shù)格式

    open()函數(shù)的語法要點(diǎn)如表2.1所示。

表2.1 open()函數(shù)語法要點(diǎn)

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

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

    close()函數(shù)的語法要點(diǎn)如表2.2所示。

表2.2 close()函數(shù)語法要點(diǎn)

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

    read()函數(shù)的語法要點(diǎn)如表2.3所示。

表2.3 read()函數(shù)語法要點(diǎn)

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

    在讀普通文件時(shí),若讀到要求的字節(jié)數(shù)前已到達(dá)文件的尾部,則返回的字節(jié)數(shù)會小于希望讀出的字節(jié)數(shù)。

    write()函數(shù)的語法要點(diǎn)如表2.4所示。

表2.4 write()函數(shù)語法要點(diǎn)

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

    在寫普通文件時(shí),寫操作從文件的當(dāng)前指針位置開始。

    lseek()函數(shù)的語法要點(diǎn)如表2.5所示。

表2.5 lseek()函數(shù)語法要點(diǎn)

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

    3.函數(shù)使用實(shí)例

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

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

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

    /* 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 /* 每次讀/寫緩存大小,影響運(yùn)行效率 */
    #define SRC_FILE_NAME "src_file" /* 源文件名 */
    #define DEST_FILE_NAME "dest_file" /* 目標(biāo)文件名 */
    #define OFFSET 10240 /* 復(fù)制的數(shù)據(jù)大小 */

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

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

        /* 以只寫方式打開目標(biāo)文件,若此文件不存在則創(chuàng)建該文件, 訪問權(quán)限值為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數(shù)據(jù)并寫到目標(biāo)文件中,每次讀寫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

    本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》

   熱點(diǎn)鏈接:

   1、Linux系統(tǒng)調(diào)用及用戶編程接口(API)
   2、什么是Linux系統(tǒng)調(diào)用,包括哪些內(nèi)容
   3、Linux中的文件及文件描述符
   4、Linux文件系統(tǒng)之虛擬文件系統(tǒng)(VFS)
   5、嵌入式文件系統(tǒng)構(gòu)建

更多新聞>> 

主站蜘蛛池模板: 云南亿华工贸有限公司-云南护栏网-云南锌钢护栏-昆明市政护栏-工地护栏-昆明护栏网厂家 | 石英砂|无烟煤滤料|火山岩|聚合硫酸铁|活性炭-河南碧水清源水处理材料有限公司 | 移动破碎机,欧版颚式破碎机-淄博巨鑫矿山机械有限公司 | 回收求购煤矿机械矿山设备,二手液压支架,刮板输送机-华建智能再生资源公司 | 消防车厂家_东风水罐泡沫消防车价格图片吨位-湖北新东日专用汽车有限公司 | 欧洲_西班牙进口_燃木真火壁炉集成服务商_燃木壁炉官方网站.hergom | 厦门公司注册-提供工商登记记账代理服务和营业执照代办地址与注册流程及费用 | 无机纤维抗菌板-A级不燃纤维板-石英纤维板厂家-医疗抗菌板-浙江德耐姆 | 西安木包装箱出口托盘定做价格-抽真空实木包装箱免熏蒸木箱多层板木箱哪家好-模压托盘及白松原木-西安宇森木业 | 新中式家具,广东新中式家具,广州新中式家具,佛山新中式家具,顺德新中式家具,乐从新中式家具,新中式家具厂家直销--唐明雅居 | 培训桌-培训椅-会议椅-洽谈桌-培训桌椅生产厂家-【鼎优家具】 | 上饶市新达新包装材料有限公司| 面粉加工设备-面粉加工机械-面粉机组-面粉磨粉机-面粉机成套设备-河南粮院机械制造有限公司 | 轻触开关,拨动开关,德艺隆(DEALON)精密工业股份有限公司 | 山东礼品盒,礼品盒生产厂家,礼品包装盒厂家-济南恒印包装有限公司 | 深圳万和制药有限公司_消化领域专业公司 万和香港(集团)成员 深圳同步带轮_东莞齿轮加工_东莞同步轮厂家-东莞东城精胜机械配件厂 | 中超直播_中超直播在线直播_中超直播免费直播视频直播-24直播网 中标通国际认证(深圳)有限公司-知识产权管理体系认证-湖北知识产权贯标 | 山东中橡新材料有限公司-专业色素炭黑厂家-生产销售各种色素炭黑-用途广泛-价格优势-供应稳定 | 上海熙隆光电科技有限公司-半导体激光器,一字线激光器,光纤耦合激光器,拉曼激光器 | 射频微波_微波元器件_芯片_电源模块_Raychem_立维创展 | 快达物流:电商和微商的仓储物流外包和托管服务-北京快达国际物流服务有限公司官方网站 | 淘金车,移动式淘金车,大小型旱地采矿车-青州冠诚重工机械有限公司 | 通风方式信号控制箱_人防呼叫按钮_人防设备厂家–西安鼎兴自控工程有限公司 | 木别墅-小木屋-防腐木木屋-成都腾龙装配式建筑科技有限公司 | 天津韬艺科技有限公司,天津网站建设公司,天津网站设计公司,品牌网站策划公司 | 重庆风机_风阀_风口-重庆仁龙风机有限公司 | 宁波允泰仪器有限公司-硬度计、拉力试验机、盐雾试验箱、影像测量仪、气动量仪 | 砂基透水砖滤水率,防滑性试验仪,砂基透水砖落球冲击,抗冲击试验机-献县中正试验仪器销售处 | 软文营销推广-新闻稿发布-软文撰写-百科词条编辑-品牌全案策划推广网络营销传播-喜尚传媒 | 液位变送器_智能压力变送器_3051差压变送器_单双法兰,投入式,电容式,温度变送器-淮安润中仪表科技有限公司 | 选金银铅锌钽铌锡铂钨铑铱镐钯宝石&金属尾矿重选-青州冠诚重工机械 | 无缝钢管生产厂家-20G-L360N无缝钢管价格-天津海诚无缝钢管集团 无尘投料站-真空上料机-旋振筛|超声波振动筛|摇摆筛|筛分机-新乡市欧霖佳机械有限公司 | 陶瓷纤维模块|陶瓷纤维毯|陶瓷纤维纸|高温隔热材料|陶瓷纤维厂家-济南火龙热陶瓷有限责任公司 | 萍乡市宏运特种陶瓷有限公司| 取样冷却器-射水抽气器-锅炉炉水取样冷却器-连灵动 | 中标通国际认证(深圳)有限公司-知识产权管理体系认证-湖北知识产权贯标 | 铸铁平台-铸铁平板平台厂家-加工优质高精度检验划线装配T型槽平台-尺寸规格全供应-建新铸造 | 威海牙科,威海种植牙,威海人工种植牙-威海经济开发区姚晓艺口腔诊所 | 铅板-济南鑫玉防辐射材料有限公司 | 氢能-燃料电池-电堆-中国氢能与燃料电池网企业最佳宣传推广平台 轻质隔墙板厂家-加气隔墙板_grc轻质隔墙板_空心实心复合隔墙板_水泥混凝土轻质隔墙板批发价格 | 专注欧美工业控制自动化设备-MRO工业品采购服务-科电远扬 |