第三章 文件I/O
3.1引言
不带缓冲I/O(unbuffered I/O):open, read, write, lseek, close.
原子操作相关:dup, fcntl,sync,fsync, ioctl.
3.2文件描述符
当打开(open)或者创建(create)一个文件的时候,内核向进程返回一个文件描述符(一个非负整数,取值范围在[0,OPEN_MAX])。
#include
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
3.3 open 函数
#include
int open(const char *pathname, int oflag, ... /*mode_t mode */);
\|/ |
pathename:要打开或者 |
创建的文件的名字。 \|/
O_RDONLY / O_WRONLY / O_RDWR -----只能选择其中的一个
O_APPEND / O_CREAT /O_EXCL/ O_TRUNC /O_NOCTTY/O_NONBLOCK
O_DSYNC/O_RSYNC/O_SYNC可选其中的多个或者一个
open 返回最小未用的描述符数值。
文件名和路径名截短
3.4 creat 函数。
creat函数用于创建一个文件。
#include
int creat(const char *pathname, mode_t mode); ----以只写方式打开所创建的文件
== open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
成功则返回为只写打开的文件描述符,出错返回-1.
3.5 close函数
close函数关闭一个打开的文件。
#include
int close(int fileds);
如果成功则返回0, 如果出错则返回-1.
关闭一个文件时还会释放该进程加在该文件上的所有记录锁。
当一个进程终止时,内核自动关闭它所有打开的文件。
3.6 lseek函数
当前文件偏移量(current file offset),非负整数,表示从文件开始处的字节数。
可调用lseek显式的为一个打开的文件设置其偏移量。
#include
off_t lseek(int filedes, off_t offset, int whence);
| |
| |
\ /
whence : SEEK_SET offset
SEEK_CUR cur_val + offset
SEEK_END file_end + offset
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
管道,FIFO,网络套接字的lseek返回-1,并将errno设置为ESPIPE.
3.7 read 函数
#include
ssize_t read(int filedes, void *buf, size_t nbytes);
成功则返回读到的字节数,若已经到文件结尾则返回0,出错-1.
3.8 write 函数。
#include
ssize_t write(int filedes, const void *buf, size_t nbytes);
3.9 I/O的效率
BUFFSIZE的大小。
3.10文件共享
UNIX系统支持在不同进程之间共享打开的文件。
内核使用三种数据结构表示打开的文件。
每个进程在进程表中都有一个记录项,
第四章 文件和目录
总结构:
struct stat{
mode_t st_mode; /*file type & mode (permissions) */
ino_t st_ino; /*i-node number (serial number) */
dev_t st_dev; /* device number (file system) */
dev_t st_rdev; /* device number for special files */
nlink_t st_nlink; /* number of links */
uid_t st_uid;
gid_t st_gid;
off_t st_size; /* size in bytes, for regular files */
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
blksize st_blksize; /*best I/O block size */
blkcnt_t st_blocks; /* number of disk blocks allocated */
};
4.1引言
4.2 stat、fstat和lstat函数
#include
int stat(const char *restrict pathename, struct stat *restrict buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf);
成功返回0, 失败返回-1
buf指向上面那个我们必须填写的结构。
一 :mode_t st_mode; /*file type & mode (permissions) */)
4.3 文件类型
1.普通文件(regular file)
2.目录文件(directory file)具有读权限的任何进程都可访问,但只有内核可以写。用本章的函数更改
3.块特殊文件(block special file)对设备的带缓冲的固定长度为单位的访问(如磁盘)
4.字符特殊文件(character special file)不带缓冲的访问,访问长度可变。设备分两类类:字符和块
5.FIFO 用于进程间通信,也叫命名管道 named pipe
6.套接字(SOCKET) 用于进程间网络通信。或者同一台宿主机上进程间非网络通信。
7.符号链接(symbolic link)用于指向另一个文件。
宏 文件类型
S_ISREG() 普通文件
S_ISDIR() 目录文件
S_ISCHR() 字符特殊文件
S_ISBLK() 块特殊文件
S_ISFIFO() 管道或FIFO文件
S_ISLNK() 符号链接
S_ISSOCK() 套接字
进程间通信对象(IPC)可表示为文件。下列宏可确定ipc对象类型。
S_TYPEISMQ() 消息队列
S_TYPEISSEM() 信号量
S_TYPEISSHM() 共享存储对象
4.4设置用户ID和设置组ID
见:http://blog.chinaunix.net/uid-27024249-id-3391125.html
4.5 文件访问权限
rwxrwxrwx
读权限允许我们读目录,获得该目录中所有文件名的列表
执行权限使我们可以通过该目录
如果指定了一个不具有执行权限的目录,那么不会在该目录下找到可执行的任何文件。
exec函数执行的必须是一个普通文件。
两个所有者id是文件的属性,两个有效ID和附加组ID是进程的性质。
4.6 新文件和目录的所有权。
4.7 access 函数
open一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其访问权限测试。
而access是按实际用户ID和实际组ID进行访问权限测试的。
#include
int access(const char *pathname, int mode);
\|/
R_OK 测试读权限
W_OK 测试写权限
X_OK 测试执行权限
F_OK 测试文件是否存在。
4.8 umask函数
umask函数为进程设置文件模式创建屏蔽字,并返回以前的值
#include
mode_t umask(mode_t cmask); 返回值:以前的文件模式创建屏蔽字。
4.9 chmod和fchmod函数
#include
int chmod(const char *pathname, mode_t mode); 对未打开的文件。
int fchmod(int filedes, mode_t mode); 对已经打开的文件。
改变现有文件的访问权限。
为了改变一个文件的权限位,进程的有效用户ID必须等于文件的所有者ID或者进程必须具有超级用户权限。
4.10 粘住位
4.11 chown,fchown和lchown函数。
二:off_t st_size; /* size in bytes, for regular files */
blksize st_blksize; /*best I/O block size */
blkcnt_t st_blocks; /* number of disk blocks allocated */
4.12 文件长度(字节为单位)
普通文件, 读到末尾的时候有文件结束标示。end-of-file
目录, 一个数的倍数。
符号链接,文件长度是文件名的实际字节数。
blksize是对文件输入输出较合适的块长度。
st_blocks是所分配的实际512或者其他数量字节块的数量。
文件中的空洞
du -s filename : 报告文件所使用的磁盘空间总量是多少个512字节块。
4.13 文件截短
打开文件的时候使用O_TRUNC标志可以做到
#incldue
int truncate(const char *pathname, off_t length);
int ftruncate(int filedes, off_t length);
函数把现有的文件截短为length字节
4.14 文件系统(为了说明文件链接的概念)
—————————————————————————————————————
磁盘| 分区1 |...|分区n |
————————————————————————————————————--
/ \
/ \
/ \
/ \
——————————————————————————————————
| | | 柱面组0 |柱面组1 |...| 柱面组n | 文件系统
——————————————————————————————————
\|/ \|/ / \
自举块 超级快 / \
/ \
/ \
——————————————————————
|超级块副本|配置信息|i节点位图|i节点|数据块|
——————————————————————
/ \
/ \
/ \
——————————————
| i节点 |i节点 |...| i节点|
——————————————
nlink_t st_nlink; /* number of links */ 硬链接
符号链接
i-node是固定长度的记录项,stat结构的大部分项都是取自i-node结构。
4.15 link unlink remove 和rename函数
#include
int link(const char *existingpath, const char *newpath);
创建一个指向现有文件的链接。
#include
int unlink(const char *pathname);
删除现有的目录项。
4.16 符号链接
阅读(814) | 评论(0) | 转发(0) |