【Linux_Unix系统编程】chapter5 深入探究文件IO
Chapter5 深入探究文件I/O
本章节将介绍另一个与文件操作相关的系统调用:多用途的fcntl(),并展示其应用之一读取和设置打开文件的状态标志。
5.1 原子操作和竞争条件
所有系统调用都是以原子操作方式执行的。是以为内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断。
以独占方式创建一个文件:
当同时制定O_EXCL与O_CREAT作为open()标志位时,如果要打开的文件已存在,则open()将返回一个错误。保证了进程是打开文件的创建者。
向文件尾部追加数据:
多个进程同时向同一个文件尾部添加数据。
5.2 文件控制操作:fcntl()
fcntl()系统调用对一个打开的文件描述符执行一系列控制操作。
#include <fcntl.h>
int fcntl(int fd, int cmd, …);
5.3 打开文件的状态标志
fcntl()的用途之一是针对一个打开的文件,获取或修改其访问模式和状态标识。
int flags, accessMode;
flags = fcntl(fd, F_GETFL);
if(flags = -1)
errExit(“fcntl”);
在上述代码之后,可以以如下代码测试文件是否以同步写方式打开:
if(flags & O_SYNC)
printf(“wirtes are synchronize\n”);
5.4 文件描述符和打开文件之间的关系
进程级的文件描述符表
系统级的打开文件表
文件系统的i-node表
5.5 复制文件描述符
dup()调用复制一个打开的文件描述符oldfd,并返回一个新描述符。二者指向同一打开的文件句柄。
#include <unistd.h>
int dup(int oldfd);
5.6 在文件特定偏移量处的I/O:pread()和pwrite()
系统第阿勇pread()和pwrite()完成与read和write()相似的工作,只是前两者会在offset参数所指定的位置进行文件IO操作,而非始于文件的当前偏移量楚,且他们不会修改文件的当前你偏移量。
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwirte(int fd, const void *buf, size_t count, off_t offset);
pread()调用等价于如下调用纳入同一原子操作:
off_t orig;
orig = lseek(fd, 0,SEEK_CUR);
lseek(fd, offset, SEEK_SET);
s = read(fd, buf, len);
lseek(fd, origin, SEEK_SET);
5.7 分散输入和集中输出(Scatter-Gather I/O):readv()和writev()
#include <sys.uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t wirtev(int fd, const struct iovec *iov, int iovcnt);
这些系统调动并非只是对单个缓冲区进行读写操作,而是一次即可传输多个缓冲区。数组iov定义一组用来传输数据的缓冲区。整数iovcnt则指定了iov的成员个数。iov中的每个成员都是如下形式的数据结构。
struct iovec
{
void *iov_base;
size_t iov_len;
}
5.8 截断文件:truncate()和ftruncate()系统调用
truncate()和ftruncate()系统调用将文件打下设置为length参数指定的值。
#include <unistd.h>
int truncate(const char* pathname, off_t length);
int ftruncate(int fd, off_t length);
若文件当前长度大于参数length,调用将丢弃超出部分,若小于参数length,调用将在文件尾部添加一系列空字节或者是一个文件空洞。
5.9 非阻塞I/O
在打开文件是指定O_NONBLOCK标志,目的有二:
(1):若open()调用未能立即打开文件,则返回错误,而非陷入阻塞。
(2):调用open()成功后,后续的I/O操作也是非阻塞的。
管道,FIFO,套接字,设备都支持非阻塞模式。
5.10 大文件I/O
过渡性LFS API
要使用过渡性的LFS API,必须在编译程序时定义 LARGEFILE64_SOURCE功能测试宏。 fopen64(),open64(),lseek64(),truncate64(),stat64(),mmap64()和setrlimit64().
调用open64(),相当于在调用open()是指定O_LARGEFILE标志。
5.11 /dev/fd 目录
对于每个进程,内核都提供有一个特殊的虚拟目录/dev/fd.该目录中包含”/dev/fd/n”形式的文件名,其中n是与进程中的打开的文件描述符相对应的编号。例如:/dev/fd/0 就对应于进程的标准输入。
e.g.:如下等价,相当于复制相应的文件描述符。
fd = open(“/dev/fd/1”, O_WRONLY);
fd = dup(1)
5.12 创建临时文件
mkstemp()和tmpfile()
基于调用者提供的模板,mkstemp()函数生成一个唯一文件名并打开该文件,返回一个可用于I/O调用的文件描述符。
#include <stdlib.h>
int mkstemp(char *template);
模板参数采用路径形式,其中最有6个字符必须是XXXXXX。
int fd;
char template[] = “/tmp/somestringXXXXXX”;
fd = mkstemp(template);
if(fd == -1)
errExit(“mkstemp”);
unlink(template);
tmpfile()函数会创建一个名称唯一的临时文件,并以读写方式将其打开。
#include <stdio.h>
FILE *tmpfile(void);
【Linux_Unix系统编程】chapter5 深入探究文件IO的更多相关文章
- 【Linux_Unix系统编程】Chapter4 文件IO
Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO std ...
- Unix系统编程()深入探究文件IO概述
open调用将引入原子atomicity操作的概念. 将某一系统调用所要完成的各个动作作为不可中断的操作,一次性加以执行. 原子操作是许多系统调用得以正确执行的必要条件. 还介绍一个系统调用fcntl ...
- Unix系统编程()在文件特定偏移量处的IO:pread和pwrite
首先我想问的是这两个p代表的是什么? 系统调用pread和pwrite完成与read和write相类似的工作,只是前两者会在offset参数所指定的位置进行文件IO操作,而非始于文件的当前偏移量处,并 ...
- UNIX高级环境编程(14)文件IO - O_DIRECT和O_SYNC详解 < 海棠花溪 >
春天来了,除了工作学习,大家也要注意锻炼身体,多出去运动运动. 上周末在元大都遗址公园海棠花溪拍的海棠花. 进入正题. O_DIRECT和O_SYNC是系统调用open的flag参数.通过指定o ...
- Linux系统编程(1)——文件与I/O之C标准I/O函数与系统调用I/O
Linux系统的I/O也就是一般所说的低级I/O--操作系统提供的基本IO服务,与os绑定,特定于Linux平台.而标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头 ...
- GPIO编程1:用文件IO的方式操作GPIO
概述 通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的 ...
- Linux系统编程(5)——文件与IO之mmap函数
mmap系统调用它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作.而Posix或系统V的共享内存IPC则纯粹用于共享目的,mmap()实现共享内存也是其主要应用之一. ...
- Linux系统编程(3)——文件与IO之fcntl函数
linux文件I/O用:open.read.write.lseek以及close函数实现了文件的打开.读写等基本操作.fcntl函数可以根据文件描述词来操作文件. 用法: int fcntl(int ...
- Linux系统编程(2)——文件与IO之系统调用与文件IO操作
系统调用是指操作系统提供给用户程序的一组"特殊"接口,用户程序可以通过这组"特殊"接口来获得得操作系统内核提供的特殊服务.在linux中用户程序不能直接访部内核 ...
随机推荐
- RabbitMQ在windows下的安装
RabbitMQ 它依赖于Erlang,需要先安装Erlang.首先确定你的window电脑是32位还是64位,以下的安装以window 64位电脑举例. 运行行Erlang/OTP(otp_wi ...
- Ubuntu终端点击确定按钮的方法
Ubuntu终端里出现需要点击 确定 按钮的时候,直接鼠标点击 确定 是不生效的,这个时候需要利用tab键选中这个 确定 按钮,然后回车键就可以了.
- iOS-----使用AFNetworking实现网络通信
使用AFNetworking实现网络通信 AFNetworking可以用于发送HTTP请求,接收HTTP响应,但不会缓存服务器响应,不能执行HTML页面中嵌入的JavaScript代码, 也不会对页面 ...
- caffe安装编译问题-ImportError: No module named caffe
问题描述 ~/Downloads/caffe$ python Python (default, Dec , ::) [GCC ] on linux2 Type "help", &q ...
- opencv-python教程学习系列7-opencv图像基本操作
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像的基本操作,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 ...
- 20155310 2016-2017-2 《Java程序设计》第八周学习总结
20155310 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 通用API •日志:日志对信息安全意义重大,审计.取证.入侵检验等都会 ...
- jsp之response方法
response简介 response对象:对客户端的请求作出回应,将Web服务器处理后的结果发回客户端. response对象:属于javax.servlet.HttpServletResponse ...
- 区间DP Zoj 3537 Cake 区间DP 最优三角形剖分
下面是别人的解题报告的链接,讲解很详细,要注意细节的处理...以及为什么可以这样做 http://blog.csdn.net/woshi250hua/article/details/7824433 我 ...
- HDU 2108 逆时针给出多边形的顶点,判断是否为凸多边形,水题
下面是别人解题报告的链接,很详细,写的很好 http://blog.csdn.net/chl_3205/article/details/8520597 下面贴我的代码 #include <cst ...
- javascript的单例模式
单例模式是javascript最基本,最有用的模式之一,它提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问.我的理解是在这个作用域中,只有通过单一的变量来访问,不存 ...