1、函数creat

可以使用creat函数创建一个新文件。

 #include<fcntl.h>
int creat(const char *path, mode_t mode); 返回值:
若成功,返回为只写打开的文件描述符;
若失败,返回-

上述函数原型等价于:

 open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);

使用creat函数的一个不足之处是它以只写的凡是打开创建的新文件。在没有open新版本函数之前,如果要创建一个临时文件,并要先写该文件,然后又读该文件,则必须先调用creat、close,然后再调用open。即可以使用下列方式实现:

 open(path, O_RDWR | O_CREAT | O_TRUNC, mode);

一般直接使用open函数替代creat函数。

2、函数lseek

每个打开的文件都有一个与之相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数(通常是),用以度量从文件开始处计算的字节数。通常,读、写操作都是从当前文件偏移量处开始,并使偏移量增加所读写的字节数。按系统默认情况下,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置成0。

可以调用lseek函数显示地为一个打开的文件设置偏移量:

 #include<unistd.h>
off_t lseek(int fd, off_t offset, int whence); 返回值:
若成功,返回新的文件偏移量
若失败,返回-

对参数offset的解释与参数whence的值有关:

  • 若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节。
  • 若whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可正可负
  • 若whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可正可负。

若lseek成功执行,则返回新的文件偏移量,为此可以使用下列方式确定打开文件的当前的偏移量:

 off_t currpos;
currpos = lseek(fd, , SEEK_CUR);

这种方法也可以用来确定涉及的文件是否可以设置偏移量。如果文件描述符指向的是一个管道、FIFO或者网络套接字,则lseek返回-1,并将errno设置为ESPIPE。

通常,文件的当前偏移量应当是一个非负整数,但是某些设备可能允许负的偏移量。但是对于普通文件,其偏移量必须是非负值。因为偏移量可能是负值,所以在比较lseek的返回值时需要谨慎,不要测试它是否小于0,而要测试它是否等于-1。

lseek仅将当前的文件偏移量记录在内核中,它并不引起任何I/O操作。然后,该偏移量用于下一个读操作或者写操作。

文件的偏移量是可以大于当前文件的长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被读为0。

文件中的空洞并不要求在磁盘中占用存储空间,具体处理方式与文件系统的实现有关,当定位到超出文件尾端之后写时,对于新写的数据需要分配磁盘快,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。

3、函数read

对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符表示该文件,将其作为参数传给read或write函数。

 头文件:#include<unistd.h>
功能:用于从文件描述符对应的文件读取数据(从打开的设备或文件中读取据---从文件描述符fd中读count个字节的数据到buf中)
ssize_t read(int fd, void*buf, size_t count)
参数说明:
fd: 是文件描述符
buf: 为读出数据的缓冲区;
count: 为每次读取的字节数(是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移)
返回值说明:
成功:返回读出的字节数
失败:返回-1,并设置errno,如果在调用read之前到达文件末尾,则这次read返回0

有几种情况可使实际读到的字节数少于要求读的字节数:

(1)读普通文件时,在读到要求字节数之前就已经达到了文件末端。例如,若在到达文件末端之前还有30个字节,而要求读100个字节,则read返回30,下一次再调用read时,它将返回0(文件末端)。

(2)当从终端设备读时,通常一次最多读一行。

(3)当从网络读时,网络中的缓存机制可能造成返回值小于所要求读的字结束。

(4)当从管道或FIFO读时,如若管道包含的字节少于所需的数量,那么read将只返回实际可用的字节数。

(5)当从某些面向记录的设备(例如磁带)读时,一次最多返回一个记录。

(6)当某一个信号造成中断,而已经读取了部分数据。

4、函数write

 #include <unistd.h>
功能:用于向文件描述符对应的文件写数据(将buf中的人count个字节的数据写入文件描述符fd指向的文件中)
ssize_t write(int fd, const void*buf, size_t count);
参数说明:
fd:是文件描述符(write所对应的是写,即就是1)
buf:通常是一个字符串,需要写入的字符串
count:是每次写入的字节数
返回值:
成功:返回写入的字节数
失败:返回-并设置errno
ps:写常规文件时,write的返回值通常等于请求写的字节数count, 而向终端设备或者网络写时则不一定

【APUE】第3章 文件I/O (2) 函数creat、lseek、read、write使用说明的更多相关文章

  1. APUE第4章 文件和目录

    4.2 文件函数 #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict b ...

  2. apue 第4章 文件和目录

    获取文件属性 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(c ...

  3. apue第七章学习总结

    apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...

  4. apue学习笔记(第四章 文件和目录)

    本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...

  5. apue 第6章 系统数据文件和信息

    在给出用户登录名或数值用户ID后,这两个函数就能查看相关项. #include <sys/types.h> #include <pwd.h> struct passwd *ge ...

  6. 【APUE】第3章 文件I/O (3) 文件共享、原子操作、函数dup/dup2、函数sync/fsync/fdatasync、函数fcntl、函数ioct1、目录/dev/fd 使用说明

    1.文件共享 UNIX系统支持在不同的进程间共享打开文件.为了说明这种共享,以下介绍内核用于所有I/O的数据结构. 内核使用3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个 ...

  7. 《UNIX环境高级编程》(APUE) 笔记第四章 - 文件和目录

    4 - 文件和目录 1. 函数 stat.fstat.fstatat 和 lstat #inlcude <sys/stat.h> int stat(const char *restrict ...

  8. 《UNIX环境高级编程》(APUE) 笔记第三章 - 文件I/O

    3 - 文件I/O Github 地址 1. 文件描述符 对于内核而言,所有打开的文件都通过 文件描述符 (file descriptor) 引用.当打开一个现有文件或创建一个新文件时,内核向进程返回 ...

  9. apue第六章学习总结

    apue第六章学习总结 1.关于阴影文件与口令 在口令文件当中,常见的字段有(以root为例): root(用户名):x(加密口令):0(uid):0(gid):root(注释字段):/root(用户 ...

随机推荐

  1. [NOIP10.5模拟赛]1.a题解--离散化+异或线段树

    题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...

  2. 【php设计模式】适配器模式

    适配器模式(对象适配器.类适配器): 将一个类的接口转换成客户希望的另一个接口.适配器模式让那些接口不兼容的类可以一起工作. 在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的 ...

  3. element消息提示封装

    官方的 <template> <el-button :plain="true" @click="open2">成功</el-but ...

  4. 1 bootstrapValidator使用

    1 如何使用 引入 <link href="bootstrapValidator.min.css" rel="stylesheet"> css文件 ...

  5. 安卓开发之ListView入门

    <!--这个地方最好用match_parent 这样效率高--> <ListView android:layout_width="match_parent" an ...

  6. 关于写SQL语句的技巧

    一.SQL总结写法 SQL的写法无非就是几种,关联查询,子查询,分组函数,各种函数的使用 1.首先根据要做的需求,先分析一下,需要用到哪些查询,例如要用到关联查询,就先把用到的表列出来,比如a,b,c ...

  7. Linux安装配置go运行环境

    1. 下载go,解压 gz包 wget https://storage.googleapis.com/golang/go1.7.5.linux-amd64.tar.gz tar zxvf go1.7. ...

  8. 五、DDL语言

    目录 简介 库的管理: 表的管理: 命令: 库的管理 创建 修改(一旦创建库,一般不修改) 删除 表的管理 创建 修改 删除 复制 常见约束 含义 分类 标识列(自增长列) 简介 DDL:数据定义语言 ...

  9. Image Processing and Analysis_8_Edge Detection:Scale-space and edge detection using anisotropic diffusion——1990

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  10. Matlab[linux]安装问题

    OS : Arch Linux 桌面:Gnome X11 软件是从网上下载的iso文件,对文件挂载或者使用解压软件解压,我个人更喜欢挂载,解压有点麻烦(我比较懒) 软件:matlab(R2016) 开 ...