Unix 环境高级编程
读者:注意仅仅是记录自己阅读进度,坚持阅读,没有深度
源代码:
http://www.libpix.org/apue/ 第二版
http://www.apuebook.com/code3e.html 第三版
第1章UNIX基础知识
- 文件和目录 2017年7月20日
- 系统调用和库函数
第2章 UNIX标准话及实现
- 最大文件描述符 sysconf
第3章 文件I/O
- 引言
- 文件描述符 0 1 2
- open函数
O_TRUNC 截短为0
文件名和路径名截短 - create函数
- close函数
内核自动关闭 - lseek函数
错误-1
od -c file.hole - read 函数
- write
常见原因:磁盘已满,超过文件限制 - I/O 效率
Linux ext2 块长4096 - 文件共享
进程表(记录项)–文件表描述符(状态,读写、标志)–v节点(属性)
多个进程写入一个文件 - 原子操作
将多个进程写入操作合并为一个步骤。 - dup和dup2函数
复制文件描述符
另外一种方法fcntl(filedes,F_DUPFD,0)
与fcntl不同的地方,dup2是原子操作,以及errno不同 - sync、fsync和fdatasync函数
保证磁盘上的文件和缓冲区高速缓存内容的一致性。
sync(int files) 修改过,然后冲洗缓冲区,排入写队列 - fcntl函数
注意 记录锁时是一个指针
文件描述符标志
文件状态标志 F_SETFL O_ - ioctl函数
磁盘操作 - /dev/fd
第4章 文件和目录
- 引言
- stat、fstat和lstat函数
- 文件类型
- 设置用户ID和设置组ID
- 文件访问权限
- 新文件和目录的所有权
- access函数
- unmask函数
- chmod和fchmod函数
- 粘住位
- chown、fchown和lchown函数
- 文件长度
du -s file # 查看file空间
wc -c file #统计字符
cat file > file.copy # 填满空洞 - 文件截短
int truncate(const char *pathname, off_t length) ftruncate()
将截短为length - 文件系统
命名该目录的目录项和目录中的.项 - link、unlink、remove和rename项
- 符号链接
- symlink和readlink函数
- 文件的时间
- utime函数
- mkdir和rmdir
- 读目录
- chdir、fchdir和getcwd函数
- 设备特殊文件
- 文件访问权限
- 小结
stat函数,文件属性了解 - 习题
unix对目录的深度有限制吗?
答:无,但是文件名有PATH_MAX
第5章 标准I/O库
- 引言
细节:缓冲区分配、优化长度执行I/O - 流和FILE对象
int fwide(FILE *fp, int mode) mode 参数设定,宽定向(多字节)返回值为正,字节定向为负值,0表示未定向 - 标准输入、标准输出、标准错误
进程预定的三个流。 - 缓冲
- 全缓冲
malloc flush - 行缓冲
遇到换行符时
行缓冲长度固定
冲洗所有行缓冲流 - 不带缓冲流
stderr fputs - 更改缓冲类型
void setbuf(FILE *restrict fp, char *restrict buf);
void setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size); - 冲洗流
int fflush(FILE *fp) 是该流所有未写的数据都被传送至内核
- 全缓冲
- 打开流
- 读和写流
- 非格式化I/O
- 一次一个字符
- 每次一行 fgets和fputs
- 直接I/O fread和fwrite
- 输入函数
- 非格式化I/O
- 每次一行I/O
- fgets gets
- fputs puts
- 标准I/O的效率
二进制I/O
#include<stdio.h>
size_t fread(void *restrict ptr,size_t size, size_t nobj, FILE *restrict fp);
size_t fread(void *restrict ptr,size_t size, size_t nobj, FILE *restrict fp);
定位流
- ftell 和fseek
- ftello 和 fseeko
- fgetpos 和 fsetpos
- 格式化I/O
- 格式化输出
printf
fprintf
sprintf在该数组的尾端自动加一个null字节,但该字节不包括在返回值中。
snprintf 显示指定缓冲区大小,避免缓冲溢出。
vprintf(,va_list arg) 可变参数 - 格式化输出
scanf() 同printf…
- 格式化输出
- 实现细节
调用dup或者fcntl 函数将要调用int fileno(FILE *fp) - 临时文件
char *tmpname(char *ptr) #创建一个与现有文件名不相同的现有路径名
FILE *tmpfile(void) #临时文件库,关闭该文件或程序自动删除 - 标准I/O的替代软件
- 效率不高 两次复制
内核与标准I/O之间
标准I/O与用户程序的行缓冲之间
mmap—映射文件
- 效率不高 两次复制
- 小结
I/O缓冲技术