《UNIX环境高级编程》学习心得 四 文件I/O(一)
这里说的文件I/O是相对标准I/O来说的。主要介绍在UNIX系统中常用的五个文件I/O函数:open、read、write、lseek、以及close。
一、open和opennat
#include <fcntl.h>
int open(const char *path, int oflag, ... /* mode_t mode */);
int opennet(int fd, const char *path, int oflag, ... /* mode_t mode */);
//返回值:若成功则返回文件描述符,若出错则返回-1.
大师将最后一个参数写为“...”,说明余下的参数的数量及其类型是可变的,还有一个注释里的参数(mode_t mode),对open函数而言,仅当创建新文件时才会使用最后这个参数。
这个函数的第一个参数,是 *path,这个参数是要打开或者创建文件的名字,是绝对路径或者相对路径。第二个参数,是这个函数的选项,详情请看书中描述。值得注意的是,有五个选项:O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读、写打开)、O_EXEC(只执行打开)和O_SEARCH(只搜索打开),这五个选项必须要有,而且只能有一个。
其余的常量则是可选的。
O_APPEND 每次写时都追加到文件的尾端。
O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志。
O_CREAT 若文件不存在,则创建它。使用此选项时,需要第三个参数 mode,用于指定该新文件的访问权限位。
O_DIRECTORY 如果path引用的不是目录,则出错。
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则会出错。用此可以测试一个文件是否存在,如果不存在,则创建此文件。
O_NOCTTY 如果 path 指的是终端设备,则不将该设备分配为此进程的控制终端。
O_NOFOLLOW 如果path引用的是一个符号链接,则出错。
O_NONBLOCK 如果指的是一个 FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本地打开操作和后续的I/O 操作设置非阻塞模式。
O_SYNC 使每次write等待物理I/O操作完成,包括由write操作引起的文件属性更新所需的I/O。
O_TRUNC 如果此文件存在,而且为只写或者读写成功打开,则将其长度截短为 0。
O_TTY_INIT 如果打开一个还未打开的终端设备,设置非标准termios参数值,使其符合Single UNIX Specification。
openat函数是POSIX.1最新版本新增的函数,为了解决相对路径和绝对路径的问题和TOCTTOU问题。
例子:我用open以只读形式打开一个名为asamplefile的文件,并且检测它是否存在,若不存在则创建它,若存在,则出错。
代码如下:
执行结果如下:
因为我使用了O_CREAT这个选项,所以需要指定第三个参数,第三个参数是指定新文件的权限位。具体在后面的章节会说明。
二、creat
除了用open使用O_CREAT选项以外,还可以用creat函数来创建一个新文件
#include <fcntl.h> int creat(const char *path, mode_t mode);
//返回值:若成功则返回以只写打开的文件描述符,若出错则返回-1.
此函数等效于:
open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);用习惯open以后觉得creat很多余= =,不知道是不是我理解有问题。
三、close
可调用close函数来关闭一个打开的文件。
#include <unistd.h> int close(int fd);
//返回值:若成功则返回0,若出错则返回-1.
关闭一个文件时还会释放进程加在这个文件上的所有记录所。
当一个进程终止时,内核自动关闭它所有打开的文件。
我觉得打开文件和关闭文件应该成对存在。就好比定界符成对存在一样。
《UNIX环境高级编程》学习心得 四 文件I/O(一)的更多相关文章
- Unix环境高级编程学习笔记——fcntl
写这篇文正主要是为了介绍下fcntl,并将我自己在学习过程中的一些理解写下来,不一定那么官方,也有错误,希望指正,共同进步- fcntl: 一个修改一打开文件的性质的函数.基本的格式是 int fcn ...
- UNIX环境高级编程 第4章 文件和目录
第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...
- 《UNIX环境高级编程》笔记——3.文件IO
一.引言 说明几个I/O函数:open.read.write.lseek和close,这些函数都是不带缓冲(不带缓冲,只调用内核的一个系统调用),这些函数不输入ISO C,是POSIX的一部分: 多进 ...
- 《UNIX环境高级编程》笔记——4.文件和目录
一.引言 本章描述文件系统的其他特征和文件的性质.有些背景知识需要注意,例如用户ID与文件权限.文件系统等. 二.函数stat.fstat.fstatat和lstat #include <sys ...
- Unix环境高级编程学习笔记——dup
dup 和 dup2 dup和dup2,都是用来将一个文件描述符复制给另一个文件描述符上,这两个文件描述符都指向同一个文件状态标志上. 只是文件描述符的大小不一样,dup所执行下的复制,肯定是返回 ...
- UNIX环境高级编程 第3章 文件I/O
前面两章说明了UNIX系统体系和标准及其实现,本章具体讨论UNIX系统I/O实现,包括打开文件.读文件.写文件等. UNIX系统中的大多数文件I/O只需要用到5个函数:open.read.write. ...
- UNIX环境高级编程 apue.h头文件的配置
http://jimslinbing.blog.163.com/blog/static/85054319201292712414518/ 1.到http://www.apuebook.com下载源码2 ...
- UNIX环境高级编程学习笔记(十)为何 fork 函数会有两个不同的返回值【转】
转自:http://blog.csdn.net/fool_duck/article/details/46917377 以下是基于 linux 0.11 内核的说明. 在init/main.c第138行 ...
- 《UNIX环境高级编程》读书笔记 —— 文件 I/O
打开或创建一个文件 #include <fcntl.h> int open(const char *pathname, int oflag, .../*mode_t mode*/); ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- 通过javascript完成分页查询功能
主要思路: 实现分页查询的关键是设置一个页面的最大数据行数和开始行号,代码如下: 最大行数我们设置为常量,不必纠结于他,所以关键就是如何把起始行号设置为变量,让他随着我们点击[上一页]或[下一页]而改 ...
- jsp与El,jstl知识点总结归纳
jsp与El,jstl知识点总结归纳 jsp部分 一.jsp的三大指令 page ,include,taglib 1.jsp中的page指令 <% page %>-设置jsp 例如: &l ...
- OBD Experts OBD II Software OBD II Protocol Stack
http://www.obdexperts.co.uk/stack.html OBD II Software OBD Experts can provide you with ready to use ...
- Ember学习(8):REOPENING CLASSES AND INSTANCES
英文原址:http://emberjs.com/guides/object-model/reopening-classes-and-instances/ 你不须要一次就完毕类所有内容的定义,通过reo ...
- 大话数据结构—平衡二叉树(AVL树)
平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,当中每个节点的左子树和右子树的 ...
- SIP入门(二):建立SIPserver
在我的上一篇文章中已经介绍怎样通过SIP软电话直接通话,可是假设须要支持很多其它用户互相通话,同一时候基于安全考虑,须要对用户帐户登录进行验证控制,这些情况下就须要建立SIPserver. SIPse ...
- 区域医疗移动医疗影像解决方案1-基于HTML5的PACS
系统描述: 1.系统基于HTML5开发,突破了平台限制,可以在任意移动终端的浏览器上调阅原始海量医学影像图像. 2.客户端无需任何下载安装,直接通过浏览器即可使用,并处理基于DICOM标准的高保真医学 ...
- 【JavaScript】JS的启动机制
DOM Event------------------>触发function() function 自身的调用 主要就是调用function 1.DOM Event 2.调用function
- [Angular2 Form] Create and Submit an Angular 2 Form using ngForm
Forms in Angular 2 are essentially wrappers around inputs that group the input values together into ...
- Android 开发中使用Intent传递数据的方法
Activity之间通过Intent传递值,支持基本数据类型和String对象及 它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.shor ...