本章开始讨论UNIX系统,先说明可用的文件I/O函数---打开文件、读写文件等

UNIX系统中的大多数文件I/O只需用到5个函数:open、read、write、lseek以及close

open函数  返回一个最小的未用描述符

#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

其中path参数是打开或创建文件的名字,flags参数由下列一个或多个常量进行“或”运算得到:

O_RDONLY  只读打开

O_WRONLY  只写打开

O_RDWR     读、写打开

O_EXEC  只执行打开

O_SEARCH  只搜索打开(应用于目录)

这5个常量中必须指定一个,下列常量则是可选的:

O_APPEND  每次写时都追加到文件的尾端

O_CLOEXEC  把FD_CLOEXEC常量设置为文件描述符标志

O_CREAT  若此文件不存在则创建它。使用此选项时,open函数必须同时说明第三个参数mode

O_DIRECTORY  如果path引用的不是目录,则出错

O_EXEL  如果同时指定了O_CREAT,而文件已经存在,则出错

O_NOCTTY  如果path引用的是终端设备,则不讲该设备分配作为此进程的控制终端

O_NOFOLLOW  如果path应用的是一个符号链接,则出错

O_NONBLOCK  如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则设置此文件本次打开操作跟后续的I/O操作为非阻塞方式

O_SYNC  使每次write等待物理I/O操作完成

O_TRUNC  如果此文件存在,而且为只写或读写成功打开,则将其长度截断为0

O_TTY_INIT  如果打开一个还未打开的终端设备,设置非标准termios参数值

creat函数

#include <fcntl.h>
int creat(const char *path,mode_t mode);

该函数相当于open(path,O_WRONLY|O_CREATE|O_TRUNC,mode);

在第四章我们会详细说明文件访问权限,并说明如何指定mode

close函数

#include <unistd.h>
int close(int fd);

close函数用于关闭一个打开文件

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,0,SEEK_CUR);

如果文件描述符指向的是一个管道、FIFO、或者网络套接字,则lseek返回-1,并将errno设置为ESPIPE。

read函数

#include <unistd.h>
ssize_t read(int fd,void *buf,size_t nbytes);

如read成功,则返回读到的字节数。如已到达文件的尾端,则返回0。

读操作从文件的当前偏移量处开始,在成功返回之前,该偏移量将增加实际读到的字节数。

write函数

#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t nbytes);

其返回值通常与参数nbytes的值相同,否则表示出错。write出错的一个常见的原因是磁盘已写满,或者超过了一个给定进程的文件长度限制。

对于普通文件,写操作从文件的当前偏移量处开始,如果打开该文件时,指定了O_APPEND选项,则在每次写操作之前,将文件偏移量设置在文件的当前结尾处。

在一次成功写之后,该文件偏移量增加实际写得字节数。

文件共享

进程为打开文件维护3张表

如果两个独立进程各自打开了同一个文件,则有下图所示的关系

函数dup和dup2

#include <unistd.h>
int dup(int fd);
int dup2(int fd,int fd2);

两个函数都可用来复制一个现有的文件描述符

dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。

dup2可以用fd2参数指定新描述符的值。如果fd2已经打开,则先将其关闭。若fd等于fd2,则返回fd2,而不关闭它。

这些函数返回的新文件描述符与参数fd共享一个文件表项,如下图所示:

digit1>&digit2表示要将描述符digit1重定向至描述符digit2的同一文件

理解./a.out > outfile 2>&1与./a.out 2>&1 >outfile的区别

fcnt函数

#include <fcntl.h>
int fcntl(int fd,int cmd,.../* int arg */);

fcntl函数可以改变已经打开文件的属性,它有以下5种功能

1 复制一个已有的描述符(cmd=F_DUPFD或F_DUPFD_CLOEXEC)

2 获取/设置文件描述符标志(cmd=F_GETFD或F_SETFD)

3 获取/设置文件状态标志(cmd=F_GETFL或F_SETFL)

4 获取/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)

5 获取/设置记录锁(cmd=F_GETLK、F_SETLK或F_SETLKW)

我们先说明cmd中的前面8种

F_DUPFD  复制文件描述符fd,返回新的文件描述符。它是尚未打开的各描述符中大于或等于第三个参数值中各值的最小值

F_DUPFD_CLOEXEC  复制文件描述符,设置与新描述符关联的FD_CLOEXEC文件描述符标志的值,返回新的文件描述符

F_GETFD  对应于fd的文件描述符标志做为函数值返回,当前只定义了一个文件描述符标志FD_CLOEXEC

F_SETFD  对于fd设置文件描述符标志。

F_GETFL  对应于fd的文件状态标志作为函数值返回,下图列出fcntl的文件状态标志

其中,3种访问方式标志(O_RDONLY,O_WRONLY,O_RDWR)并不各占一位,因此首先必须用屏蔽字O_ACCMODE取得访问方式位,然后将结果与这3个值得每一个比较。

F_SETFL  将文件状态标志设置为第三个参数的值。可以更改的几个标志是O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC、O_RSYNC、O_FSYNC和O_ANSYNC

F_GETTOWN  获取当前接收SIGIO和SIGURG信号的进程ID或进程组ID。

F_SETOWN  设置接收SIGIO和SIGURG信号的进程ID或进程组ID

下面程序将打印文件状态标志说明

#include "apue.h"
#include <fcntl.h>int
main(int argc, char *argv[])
{int        val;if (argc != 2)err_quit("usage: a.out <descriptor#>");if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)err_sys("fcntl error for fd %d", atoi(argv[1]));switch (val & O_ACCMODE) {case O_RDONLY:printf("read only");break;case O_WRONLY:printf("write only");break;case O_RDWR:printf("read write");break;default:err_dump("unknown access mode");}if (val & O_APPEND)printf(", append");if (val & O_NONBLOCK)printf(", nonblocking");if (val & O_SYNC)printf(", synchronous writes");#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) && (O_FSYNC != O_SYNC)if (val & O_FSYNC)printf(", synchronous writes");
#endifputchar('\n');exit(0);
}

下面函数用于设置文件状态标志

#include "apue.h"
#include <fcntl.h>void
set_fl(int fd, int flags) /* flags are file status flags to turn on */
{int        val;if ((val = fcntl(fd, F_GETFL, 0)) < 0)err_sys("fcntl F_GETFL error");val |= flags;        /* turn on flags */if (fcntl(fd, F_SETFL, val) < 0)err_sys("fcntl F_SETFL error");
}

转载于:https://www.cnblogs.com/runnyu/p/4633456.html

apue学习笔记(第三章 文件I/O)相关推荐

  1. Unix原理与应用学习笔记----第六章 文件的基本属性2

    Unix原理与应用学习笔记----第六章 文件的基本属性2 改变文件权限命令:chmod 提示:文件或目录创建后,就被赋予一组默认的权限.所有的用户都有读,只有文件的所有者才有写. 相对权限设置 Ch ...

  2. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  3. 机器人导论(第四版)学习笔记——第三章

    机器人导论(第四版)学习笔记--第三章 3 操作臂运动学 3.1 引言 3.2 连杆的描述 3.3 连杆连接的描述 3.4 连杆坐标系的定义 3.5 操作臂运动学 3.6 驱动空间.关节空间和笛卡尔空 ...

  4. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第三章:简单控件

    第 3 章 简单控件 本章介绍了App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图.容纳视图的常用布局.响应点击的按钮控件.显示图片的图像视图等.然后结合本章所学的知识,演示了一个实战项 ...

  5. Win32学习笔记 第三章 HelloWin 选择自 villager 的 Blog

    Win32学习笔记 作者: 姜学哲(netsail0@163.net) 教材: Windows程序设计(第五版)北京大学出版社  [美]Charles Petzold 著  北京博彦科技发展有限公司 ...

  6. ros2 Navigation 学习笔记 第三章(the construct 网站)

    第三章 如何在环境中给机器人定位 序言 本章包括: 机器人定位的意义(即需要知道它对于环境中的位置和方向) 如何在ROS2中用AMCL定位 如何设置机器人的初始位置(手动.自动与使用ROS API) ...

  7. 信号与系统学习笔记 第三章

    第三章 周期信号的傅里叶级数表示 下面将讨论信号与线性时不变系统的另一种表示,讨论的出发点仍是将信号表示成一组基本信号的线性组合.这是因为,将信号表示成基本信号的线性组合是有利的,如果基本信号具有一下 ...

  8. 仿生学导论学习笔记——第三章

    第三章 仿生学基本要素 3.1 仿生需求 3.1.1 需求驱动 3.1.1.1 生存需求 3.1.1.2 健康需求 3.1.1.3 军事需求 3.1.1.4 发展需求 3.1.1.5 精神需求 3.1 ...

  9. 计算机网络学习笔记——第三章:数据链路层

    目录 第三章:数据链路层 3.1 数据链路层功能概述 3.2 封装成帧和透明传输 3.3 差错控制 3.3.1 检错编码 3.3.2 纠错编码 3.4 流量控制与可靠传输机制 3.4.1 流量控制.可 ...

  10. JavaScript高级程序设计红宝书学习笔记第三章基本概念

    第三章 基本概念 本章内容 语法 数据类型 操作符 语句 函数 3.1 语法 3.1.1 区分大小写,ECMAScript中的一切(变量.函数名和操作符)都区分大小写. 3.1.2 标识符 标识符:变 ...

最新文章

  1. 使用Spring Boot和Spring MVC自定义HttpMessageConverters
  2. 把Excel中的数据转换成Sql语句
  3. 使用 PC 做 FTP/TFTP 服务器,上传和下载文件
  4. 解锁WPS企业版,去广告,享会员服务
  5. 新益华基层医疗系统使用方法_家中更换新路由器了,但不知道如何替换?可以尝试使用这种方法...
  6. TFN RMT 手持式路测仪 5G NR 手持式频谱分析仪
  7. ios微信支付服务器错误,iOS开发之-微信支付
  8. android JeckPack官方文档学习
  9. 基于人工智能的盲人阅读器
  10. python123凯撒密码_凯撒密码和反密码
  11. 天龙八部TLBB系列 - 网单服务端各目录文件说明【超详细】
  12. 大气的品牌化妆品官网模板
  13. 写一手好SQL很有必要
  14. 简述计算机视觉中的单眼线索,知觉-心理学文章-壹心理
  15. DRF 框架总结 - 视图集路由 Routers
  16. 各类工控软件图库(组态王,威纶通,西门子,昆仑通泰等通用
  17. 一步一图带你深入理解 Linux 虚拟内存管理
  18. 《因果学习周刊》第13期:ICLR 23因果推断高分论文
  19. FFmpeg支持的音频和视频编解码格式
  20. javaSE编写的小游戏打包成可执行文件

热门文章

  1. python读音有道词典-有道词典命令行快速翻译,Python编程的利器
  2. 怎么用python画简单的图-Python | 用matplotlib画些简单的图
  3. python3.7.2使用-centos7系统下python2与python3共存
  4. python爬虫百科-Python从概念上先了解爬虫
  5. python3.7安装turtle步骤-Python怎么引入turtle
  6. python叫什么语言-python是什么语言编写的
  7. python3爬虫实例-python3.7简单的爬虫实例详解
  8. 可以考的python方面的证书-python有证书的加密解密实现方法
  9. python怎么导入txt文件夹-python读取一个目录下所有txt里面的内容方法
  10. python3下载文件-在Python 3中从web下载文件?