Chapter4 文件IO

4.1 概述
文件描述符 == Windows的句柄
标准文件描述符:

0 标准输入 STDIN_FILENO stdin
1 标准输出 STDOUT_FILENO stdout
2 标准错误 STDERR_FILENO stderr

(1):fd = open(pathname, flags, mode)
(2):numread = read(fd, buffer, count)
(3):numwritten = write(fd, buffer, count)
(4):status = close(fd)

4.2 通用IO

4.3 打开一个文件:open()
open()既能打开一个已经存在的文件,也可以创建并打开
#include <sys/stat.h>
#include <fcntl.h>
int open(const char* pathname, int flag, .../*mode_t mode*/);
flag: 掩码,用于指定文件的访问模式。

文件的访问模式:
O_RDONLY 以只读的方式打开文件
O_WRONLY 以只写的方式打开
O_RDWR 以读写的方式打开

open()调用所返回的文件描述符数值:
SUSv3规定,如果调用open()成功,必须保证其返回值为进程未使用文件描述符中数值最小者。
eg:确保使用标准输入(文件描述符0)打开文件。
if(close(STDIN_FILENO) == -1)
errExit("close");

fd = open(pathname, o_RDONLY);
if(fd == -1)
errExit("open");

4.3.1 open()调用中的flags参数
(1):文件的访问模式, O_RDONLY, O_WRONLY,O_RDWR标志,调用open()是不能同时使用。调动fcntl()的F_GETFL操作能够检索文件的访问模式。
(2):
(3)

O_APPEND:总是在文件尾部追加数据
O_ASYNC:当对于open()调用所返回的文件描述符可以实行I/O操作时,系统会产生一个信号通知进程。
O_CLOSEXEC: 为新的文件描述符启用close-on-flag标志(FD_CLOEXEC)。
⋯⋯

4.3.2 open()函数错误
若打开文件发生错误,open()将返回-1,错误号errno标识错误原因。
EACCES:文件权限不允许调用进程以flags蚕食指定的方式打开文件
EISDIR:所指定的文件属于目录,而调用者企图进行写操作。
EMFILE:进程打开的文件数量达到了进程资源的设定上限
ENFILE:文件打开资源达到了系统允许的上限
ENOENT:文件不存在且未指定O_CREATE标志,或者指定的路径目录之一不存在。
EROFS:文件属于只读文件系统
ETXTBSY:指定的文件为可执行文件,且在运行。

4.3.3 create()系统调用
#include <fcntl.h>
int create(cosnt char *pathname, mode_t mode);
create()系统调用等价于如下open()调用
fd = open(pathname, O_WRONLY | O_CREATE | O_TRUNC. mode);

4.4 读取文件内容: read()
#include <unistd.h>
ssize_t read(int fd, void *buffer, size_t count);
count : 最多能读取的字节数
size_t : 无符号整形 ssize_t: 有符号整形
注意:系统调用不会分配内存缓冲区用于返回信息给调用者。

使用read()从终端读取一连串字符,
char buffer[MAX_READ + 1];
ssize-t numRead;

numRead = read(STDIN_FILENO, buffer, MAX_READ)'
if(numRead == -1)
errExit("read");

buffer[numRead] ='\0';
printf("The input data was: %s \n", buffer);

4.5 数据写入文件: write()
#include <unistd.h>
sszie_t write(int fd, void *buffer, size_t count);

4.6 关闭文件:close()
#inclue <unistd.h>
int close(int fd);

4.7 改变文件偏移量: lseek()
#inclue <unistd.h>
off_t lseek(int fd, offst_t offset, int whence);
offset : 指定一个以字节为单位的数值。
whence:表明应参照那个基点来解释offset
SEEK_SET: 从文件头部开始
SEEK_CUR: 相对当前文件偏移量
SEEK_END: 文件尾部

eg:获取文件偏移量的当前位置 curr = lseek(fd, 0, SEEK_CUR);

文件空洞:

如果文件偏移量跨越了文件结尾,然后再执行I/O操作时候,read()调用将返回0,表示文件结尾。但是write()函数可以再文件结尾后的任意位置写入数据。
从文件结尾后到新写入数据间的这段空间被称为文件空洞。从编程角度看,文件空洞中是存在字节的,读取空洞将返回以0(空字节)填充的缓冲区。

4.8 通用I/O模型以外的操邹:ioctl()
#include <sys/ioctl.h>
int ioctl(int fd, int request, .../* argp */)

【Linux_Unix系统编程】Chapter4 文件IO的更多相关文章

  1. UNIX系统编程:文件IO(I)

    1.标准C库中访问文件用的是文件指针FILE *(stdin,stdout,stderr):对于linux系统编程而言,所有对设备或文件的操作都是通过文件描述符进行的 2.当打开或者创建一个文件的时候 ...

  2. linux系统编程之文件IO

    1.打开文件的函数open,第一个参数表示文件路径名,第二个为打开标记,第三个为文件权限 代码: #include <sys/types.h> #include <sys/stat. ...

  3. Linux系统编程:简单文件IO操作

    使用Linux的文件API,经常看见一个东西,叫做文件描述符. 什么是文件描述符? (1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在 ...

  4. 【Linux_Unix系统编程】chapter5 深入探究文件IO

    Chapter5 深入探究文件I/O 本章节将介绍另一个与文件操作相关的系统调用:多用途的fcntl(),并展示其应用之一读取和设置打开文件的状态标志. 5.1 原子操作和竞争条件 所有系统调用都是以 ...

  5. linux系统编程之文件与io(一)

    经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自 ...

  6. linux系统编程之文件与io(五)

    上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...

  7. Unix环境编程之文件IO

    1.文件IO 2.文件与目录 3.进程 4.多线程编程 5.信号 6.进程间通信 学习linux编程,首先要学会使用shell,这里一些基础命令就不介绍了.这里唯一要提的一个shell命令就是man. ...

  8. Unix环境高级编程:文件 IO 原子性 与 状态 共享

    参考 UnixUnix环境高级编程 第三章 文件IO 偏移共享 单进程单文件描述符 在只有一个进程时,打开一个文件,对该文件描述符进行写入操作后,后续的写入操作会在原来偏移的基础上进行,这样就可以实现 ...

  9. 【Linux 应用编程】文件IO操作 - 常用函数

    Linux 系统中的各种输入输出,设计为"一切皆文件".各种各样的IO统一用文件形式访问. 文件类型及基本操作 Linux 系统的大部分系统资源都以文件形式提供给用户读写.这些文件 ...

随机推荐

  1. Jmeter系列培训(1)--开山篇

    ​       一直以来,我们不断分享,有的人喜欢,也有的人不喜欢,这都没什么,喜欢的点个赞,留个言,不喜欢的就不看好了,今天我们继续,关于jmeter我们分享了很多工作遇到的问题的解决方案,但是很多 ...

  2. 按照Right-BICEP要求设计四则运算2程序的单元测试用例

    Right——结果是否正确? B——是否所有的边界条件都是正确的? I——能查一下反响关联吗? C——能用其它手段交叉检查一下吗? E——你是否可以强制错误条件发生? P——是否满足性能要求? 测试计 ...

  3. How to convert int [12] to array<int, 12>

    code: // array::data #include <iostream> #include <cstring> #include <array> int m ...

  4. opencv-python教程学习系列3-视频操作

    前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍视频的获取和保存,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 ...

  5. TJU Problem 1065 Factorial

    注意数据范围,十位数以上就可以考虑long long 了,断点调试也十分重要. 原题: 1065.   Factorial Time Limit: 1.0 Seconds   Memory Limit ...

  6. L3-018 森森美图 (30 分)

    森森最近想让自己的朋友圈熠熠生辉,所以他决定自己写个美化照片的软件,并起名为森森美图.众所周知,在合照中美化自己的面部而不美化合照者的面部是让自己占据朋友圈高点的绝好方法,因此森森美图里当然得有这个功 ...

  7. JPEG文件格式

    格式:JFIF(JPEG档的交换格式)压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1)以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身,用来定义图像的压 ...

  8. 在windows下制作mac os x的启动安装U盘

    前几天有幸用了下Macbook pro,可在给它装win 7系统时,无知而又手贱地在windows系统下分区了:( 然后再重启就找不到Mac os x,只有win 7了.可进win 7也不正常,直接给 ...

  9. C# 中的应用配置

    配置功能是软件必要的功能,下面介绍以下 Glacier 内置的配置框架,Glacier 支持三种方式的配置: appSettings 配置 嵌入的 HOCON 配置 独立的 HOCON 配置 优先级: ...

  10. JAVA中@SuppressWarnings注解的作用

    eclipse中开发JAVA代码时,经常会出现编译告警符号,影响代码可读性,也影响调试的断点符号正常显示,可以使用@SuppressWarnings注解来抑制这些告警符号的再现.1.抑制单个类型的告警 ...