Chinaunix首页 | 论坛 | 博客
  • 博客访问: 635620
  • 博文数量: 171
  • 博客积分: 2246
  • 博客等级: 大尉
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 11:45
文章分类

全部博文(171)

文章存档

2018年(3)

2017年(4)

2015年(1)

2014年(20)

2013年(57)

2012年(86)

分类: LINUX

2012-10-18 15:59:37

第三章  文件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 符号链接

阅读(762) | 评论(0) | 转发(0) |
0

上一篇:kernel gpio.txt 翻译

下一篇:CPL,DPL,RPL的区别

给主人留下些什么吧!~~