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. @Html.ActionLink方法

    Html.ActionLink:MVC提供的自动构造重写地址的方法,该方法有五个重载 1.Html.ActionLink("linkText","actionName&q ...

  2. RestShrap Simple REST and HTTP Client for .NET 了解

    最近做一个项目,需要上传文件到文件服务器, 文件服务器是 内部的webapi形式的接口.经朋友推荐使用restshrap , 例子: //上传文件 var request=new RestClient ...

  3. div可以同时设置背景图片和背景颜色吗?

    前言 当然可以同时设置 当图片背景色不透明时 情况一:当图片的长.宽 >= div的长.宽时 我们最终看到div背景是图片,之所以说是最终看到,是因为在页面加载时,我们先看到的div背景是颜色, ...

  4. 【QT 学习笔记】 一、 VS2015+ QT环境安装

    1.   安装    qt-opensource-windows-x86-msvc2015_64-5.6.0.exe   (根据自己的VS版本来安装) 下载地址 http://download.qt. ...

  5. ES6入门六:class的基本语法、继承、私有与静态属性、修饰器

    基本语法 继承 私有属性与方法.静态属性与方法 修饰器(Decorator) 一.基本语法 class Grammar{ constructor(name,age){ //定义对象自身的方法和属性 t ...

  6. Delphi 线程的基本概念

  7. web开发:Bootstrap

    一.ajax请求 二.前台服务器概念 三.bs导读 四.bs引入 五.bs容器与响应式 一.ajax请求 - 后台 ```python# 通过flask框架搭建后台from flask import ...

  8. CentOS7 基于 subversion 配置 SVN server

    由于 Window Server 环境下,VisualSVN Server Community 版本只支持 15 个同时在线用户,所以彻底放弃 Windows Server,在 Linux Serve ...

  9. Ubuntu系统---以virtualenv方式安装Tensorflow-CPU

    Ubuntu系统---以virtualenv方式安装Tensorflow-CPU 一.安装环境 环境:Ubuntu18.04+CPU+python2.7 本文介绍:如何在ubuntu上以virtual ...

  10. gitlab 错误处理

    用gitolite新建项目,clone后首次push,可能会出现: $ git push No refs in common and none specified; doing nothing. Pe ...