unix环境高级编程【读书笔记】
文件
Unix支持在不同进程之间共享打开的文件。
内核使用三种数据结构表示打开的文件:
原子操作
一般而言,原子操作指的是由多步组成的操作。如果该操作原子的执行,要么执行完所有步,要么一步也不执行,不可能只执行所有步骤的一个子集。
1、 任何一个需要多个函数调用的操作都不可能是原子操作。因为两个函数在调用期间,内核可能会临时挂起某个进程,unix提供一种操作是这种操作成为原子操作,即添加O_APPEND标志。
2、 注意:
原子操作函数:pread, pwrite
Pread:相当于调用read、lseek,但是区别如下
l 调用pread时无法中断其定位和读操作
l 不更新文件指针
3.12 dup和dup2函数
=======================
Int dup(int files);
Int dup2(int files, int files2);
========================
功能:成功返回新的文件描述符,出错返回-1;
注意:
1、由dup返回的文件描述符,一定是当前可用文件描述符中最小的文件描述符。
2、可以用dup2指定返回的文件描述符的具体值。
l 如果file2正在打开,则先将其关闭。
l 如果files等于file2,则返回file2的值,而不关闭。
3、
- dup(files) 等价于fcntl(fileds,F_DUPFD,0)
- dup2(files1,files2)等价于close(files2),fcntl(fileds,F_DUPFD,files2)不完全等价,因为dup2是原子操作函数,而close和fcntl之间可能会被其他信号插入。
3.13 sync fsync和fdatasync函数
注意:
延迟写:由于内核中设有缓冲区高速缓存或页面高速缓存,大多数的磁盘IO都是通过缓冲进行的,当写数据时,内核通常会将数据复制一份到缓冲区,但是如果缓冲区尚未写满,不会排入输出队列。直到缓冲区被写满或这块缓冲区需要重用来存储其他的数据。
优点:
- 减少了磁盘的读写次数。
缺点:
- 降低了文件内容的更新速度,如果系统发生故障可能会有一部分文件丢失。
解决方法:
² Sync fsync fdatasync
Sync:
只是将所有修改过的块的缓冲区排入写对了,然后就返回。不等待写磁盘结束。
Fsync:
只针对文件描述符为files的单一文件起作用,等待文件写磁盘结束再返回。
Fdatasync:
只影响文件的数据部分,而且还具有同步更新文件属性的功能。
3.14 fcntl函数
可以改变自己打开的文件的性质。
===============================
#include <fcntl.h>
Int fcntl(int fileds,int cmd, …);
===============================
功能:
1) 复制一个现有的文件描述符cmd = F_DUPFD
2) 获得/设置文件描述符的标志 cmd = F_GETFD 或 F_SETFD
3) 获得/设置文件的状态标志 cmd = F_GETFL 或 F_SETFL
4) 获得/设置异步IO所有权 cmd = F_GETOWN 或 F_SETOWN
5) 获得/设置记录锁 cmd = F_GETLK 、F_SETLK或 F_SETLKW
注意:
l 第三个参数是指向一个结构的指针。
文件系统
如果用名字引用文件的函数时,需要了解该函数是否跟随符号链接到达它所链接的文件,如果具有,则其路径名参数引用由符号链接指向的文件,否则直接引用链接的本身,而 不是该链接指向的文件。(mkdir mkinfo mknod rmdir这几个函数除外)
O_CREAT和O_EXCL两者调用open函数的时候若路径名引用符号链接,open将出错返回,并将errno设置为EEXIST。这种处理方式意图是堵塞一个安全性漏洞,是具有特权的进程不会被诱骗对不合适的文件进行写操作。
第四章 文件和目录
4.1 stat 、fstat和lstat函数
#include <sys/stat.h>
Int stat(const char *pathname, struct stat*buf);
Int fstat(int fileds, struct stat* buf);
Int lstat(const char *pathname,strcut stat *buf);
功能:成功返回0,若出错返回-1
Stat:
返回与命名文件有关的信息结构
Fstat:
返回与该文件描述符有关的信息结构
Lstat:
返回与该文件符号链接有关的有关信息结构
第二个参数 buf指针,指向我们必须提供的结构。
4.2 文件类型
1、文件的类型:
1) 普通文件 S_ISREG
2) 目录文件 S_ISDIR
- 其他文件的名字
- 指向其他文件信息结构的指针
注意:任何一个进程都有权限读目录文件,但是只有内核才有权限写该目录文件
3) 块特殊文件S_ISBLK
4) 字符特殊文件S_ISCHR
5) FIFO S_ISFIF 管道,用于进程间通信(IPC)
6) 套接字 S_ISSOCK 用于进程间的网络通信
7) 符号链接S_ISLNK

浙公网安备 33010602011771号