UNIX 文件I/O总结

输入是从I/O设备拷贝数据到主存,输出是从主存拷贝数据到I/O设备。

一个文件就是一个字节序列。

所有的I/O设备,如网络、磁盘、和终端,都被模型化为文件,而所有的输入和输出都被当做想对应的文件的读写来执行。

1、ISO C的I/O操作是带缓存的,而POSIX标准的I/O操作是指真正发生了系统调用,是不带缓存的

2、文件描述

(1)是对一个已打开文件的引用,是由shell定义,Unix沿用,与内核无关。

(2)文件描述符是一个非负整数,0、1、2已被标准输入、标准输出和标准错误关联

(3)文件描述符是在某一个进程/线程中对一个文件的描述,同一个文件在不同进程/线程中的描述符可以不同,这也是文件共享的理论基础

3、文件打开操作 open()和openat()

(1)返回文件描述符或者-1

int open(char *filename, int flags, mode_t mode);
int openat(int fd,<span style="font-family: Arial, Helvetica, sans-serif;">char *filename, int flags, mode_t mode</span>)

(2)flags参数

O_RDONLY: Reading only

O_WRONLY: Writing only

O_RDWR: Reading and writing

还有O_APPEND、O_CREAT、O_SYNC等常用的参数。有需要参考官方文档。

(3)openat()的引入是为了解决

open()中文件路径为相对路径时,不再只能打开当前工作目录的文件的问题

避免两个函数调用相关联引起的文件覆盖问题

fd为参数指出了相对路径在文件系统的起始地址

4、创建文件

int creat(const char *path,mode_t mode);
等效于
open(path,O_WRONLY|O_CREAT|O_TRUNC,mode)

creat()以只写的方式创建并打开文件,不能立即读取文件,所以最好用第二种方法。

5、文件关闭

int close(int fd);

关闭文件,释放记录锁。进程关闭时,内核会自动关闭该进程的所有调用文件,所以有时不比显示关闭文件。

6、文件偏移函数

off_t lseek(int fd,off_t offset, int whence);

whence:

SEEK_SET     文件操作从offset处开始

SEEK_CUR   文件已有偏移+offset

SEEK_END  文件长度+offset

offset 可正负

off_t的类型决定了一个文件的最大长度,32位时,有符号位,最大长度为2^31-1,2GB

7、读操作

ssize_t read(int fd, void *buf,size_t nbytes);

(1)返回-1,出错;返回0,到达文件末尾;返回正整数,读取字节数

(2)设置读取nbytes,在不同设备上可以读取的字节数往往不能满足nbytes

8、写操作

ssize_t write(int fd, void *buf,size_t nbytes);

(1)出错,返回-1,成功返回写的字节数

(2)默认写操作时从当前偏移开始的,但是当在打开文件设置了O_APPEND参数时,文件偏移设为了末尾,在末尾插入nbytes数据。

9、文件共享

(1)每个进程的进程表有一个表项记录打开文件的文件描述符表,不同的描述符,都对应一个不同的文件表

(2)文件表记录文件的状态(读、写、阻塞、同步、添加等)、文件偏移量和指向文件V结点结构的指针,仍然属于当前进程

(3)文件V结点结构是描述具体文件的信息载体。包含文件类型、对此文件的各种操作、文件作者、长度、指向文件所在磁盘位置的指针等。

文件V结点也是对具体文件系统的抽象,不属于某一个进程。

这样,不同进程可以对同一个文件V结点结构进行操作,在处理好同步的情况下,可以实现不同进程/线程的文件共享。

10、文件描述符的复制

共享同一个文件表

int dup(int fd);
int dup2(int fd, int fd2);

dup()函数返回fd文件符描述文件的最小可用文件描述符,失败返回-1

dup2(fd,fd2)函数返回指定文件描述符fd2,如果fd2被占用,则先将其关闭,如果fd2=fd,返回fd2。失败返回-1。

11、缓存区刷新

延迟写:

内核中设有缓存区高速缓存或者页高速缓存,大多数I/O操作都要经过缓存区,再排入读写队列,最后由系统守护进程定时调用sync函数写入磁盘

void sync(void);
int fsync(int fd);

sync将修改过的缓存区排入写队列,就返回,不管是否写入磁盘。写队列由系统守护进程update维护

fsync(fd)只将文件描述符fd描述的文件的修改部分立即调用I/O操作写入磁盘。

12、改变已打开文件的属性

int fcntl(int fd,int cmd,.../*int arg*/);

该函数有五种功能:

(1)辅助一个已有的描述符,功能同dup() dup2()函数

(2)获取/设置文件描述符的标志,即改变FD_CLOEXEC的值,0开,1关闭

(3)获取/设置文件状态

(4)获取/设置异步I/O的所有权

(5)获取/设置记录锁

13、ioctl函数

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制。

详细参考:http://blog.csdn.net/shanshanpt/article/details/19897897

时间: 2024-08-05 03:36:31

UNIX 文件I/O总结的相关文章

unix 文件清理一例

unix环境下,经常会遇到一种情况,就是存放日志的文件目录满了,需要进行清理.通常来说,日志文件具有一定的时效性,例如一周,超过一周的日志文件就可以进行清理(以应用日志为例,数据库ARCH日志,以是否备份完成为标准). 在windows环境下,我们可以用图形界面,根据时间排序,然后用鼠标框选文件,然后按下delete键,多方便.可是在unix字符界面下,我们没有鼠标,没有框选,只能使用命令了,下面我们就介绍下如何通过命令简单快速的实现我们的需求. 首先,我们来假设一个应用场景: 接到文件系统使用

unix文件操作函数

1. fopen函数 1 #include <stdio.h> 2 FILE *fopen(const char *path, const char *mode) 返回:文件顺利打开后,指向该流的文件就会被返回.如何文件打开失败则返回NULL,并把错误代码存在 errno 中. 参数说明: mode: 1)r        以只读方式打开文件,该文件必须存在.     2) r+     以可读写方式打开文件,该文件必须存在.    3) rb+   以读写打开一个二进制文件,允许读写数据,文

Unix文件操作

一.概述 Unix文件操作常用函数包括open.close.creat.lseek.dup.dup2.fcntl等, 其中open.creat. fcntl函数需要包含头文件<fcntl.h>, 其余几个函数需要包含头文件<unistd.h>. 由于在Linux操作系统 中使用man命令可以非常方便的查找函数原型及示例,这里就不帖出函数原型了,只讲一下使用时需要注意的地方. 二.文件描述符 每一个在程序中打开的文件都有一个相应的文件描述符(file descriptor),Unix

使用UltraEdit实现从DOS文件到UNIX文件的批量转换

最近把公司从SVN切到GIT下,因为大多同事在Windows下开发,又碰到换行符问题,找到一个批量转换方法 打开UE->在文件中替换,把^p替换成^n,然后设置好要替换的文件和路径,就开始替换吧. 使用UltraEdit实现从DOS文件到UNIX文件的批量转换

Unix文件 I/O(不带缓冲区的)上

简介 Unix系统大多数文件i/o只需要:open.read.write.lseek.close这几个函数.但是某些时候我们也需要fcntl.ioctl.sync等函数配合使用.这些函数都是不带缓冲区的I/0(unbuffered I/O), 术语不带缓冲的指的是每个read和write都是内核中的一个系统调用.这些函数都是POSIX和single UNIX Specification的组成部分. 这样说可能有点迷糊,举个例子说明 不带缓存的I/O:       read,write,open.

unix文件描述符——socket

在unix系统中,socket和普通文件一样对待,因为它可以像普通文件一样被读和写,但是它还有一些自己独特的特点,例如,文件的读写位置可以设置,但是socket只能被顺序的读写等等,那么在unix系统中,是如何实现这种方式的呢? 如下图,其中有以下重要数据结构:proc.filedesc.file等,对这些重要数据结构及其之间的关系弄清楚之后,上面的问题自然就有答案了.在本文介绍中,使用的操作系统源码为:4.4bsd-lite版本,该版本是<TCP/IP协议卷2--实现>一书使用的源码,同时该

UNIX文件的权限之“设置用户ID位”

用stat函数可以获取一个文件的状态信息,原型是这样的: int stat(const char *path, struct stat *buf); 其中结构体stat的结构: struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of h

unix 文件系统结构标准 (fhs)

文件系统层次结构 翻译者:Yinghua Wang [email protected] 若发现问题请和我联 系 目录 第一章 介绍.............................................................. 1 1.1.目的............................................................1 1.2.约定..............................................

Unix - 文件里构成一个空洞的分析

lseek函数显示地为一个打开文件设置偏移量,文件偏移量能够大于文件的当前长度,在这样的情况下.对该文件的下一次写将加长该文件.并在文件里构成一个空洞,这一点是同意的. 位于文件里但没有写过的字节都被读为0. eg: holeFile.c函数创建了一个具有空洞的文件,执行观察: 能够看到,文件里的30个未写入字节都被设置读为0.每一行開始的一个7位数是以八进制形式表示的字节偏移量. 将刚创建的文件与相同长度但舞空洞的文件进行比較 尽管两个文件的长度同样,但无空洞文件占用了20个磁盘块,而具有空洞