笔者将《unix环境高级编程》主要内容总结为三篇:文件篇,进程篇,高级io和进程间通信三大板块。本文是unix环境高级编程系列文章第一篇:文件篇。该篇主要包括:
介绍了unix的体系结构,以及unix中的文件和目录,输入输出,程序和进程,信号等基本概念
标准包括C语言的标准和操作系统标准,实现包括BSD,FreeBSD,Linux,Solari,Mac os等
包括文件描述符,对文件的打开,关闭,定位,读,写,改变文件属性操作。内核IO调用基于文件描述符。还介绍了文件的底层数据结构,了解数据结构之后就能理解文件是如何支持共享的
主要介绍文件的属性和属性对应的数据结构,以及各个字段控制的问访问权限,文件类型等。unix中一切皆文件,这些文件包括:普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字和符号链接。最后结束UFS文件系统。
标准io解决了内核io的很多细节问题,包括缓冲区分配。所有操作基于流和File对象
最后介绍系统提供的一些数据文件,包括口令文件,阴影文件,朱文杰,登录账号文件,服务数据文件,协议数据文件,网络数据文件等
通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件
每当运行一个新程序时,shell都为其打开三个文件描述符:
说明 | 文件描述符 | 头文件 | 宏 |
---|---|---|---|
标准输入 | 0 | | STDIN_FILENO |
标准输出 | 1 | | STDOUT_FILENO |
标准出错 | 2 | | STDERR_FILENO |
进程控制的主要函数:fork,exec和waitpid
unix系统一直使用两种不同的时间值
unix支持在不同进程间共享打开的文件,unix内核使用什么数据结构来支持这种共享呢?
这几个函数出现的背景:unix提供的延时写功能,通过提供缓冲区以减少磁盘读写次数,但是降低了文件内容更新速度,这几个函数用于保证缓冲区内容与文件内容的同步,保证一致性。
struct stat {
mode_t st_mode; //文件模式,包含文件类型,用户id,组id,访问权限(9种)等信息
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件数据最后被访问的时间
time_t st_mtime; //文件数据最后被修改的时间
time_t st_ctime; //文件状态(i节点状态)的最后修改时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //伟建内容对应的块数量
};
硬链接直接指向文件的i节点
符号链接是指向一个文件的间接指针。
标准io提供三种类型的缓冲
读写流有三种不同的方式
不带f前缀的从标准输入流读取数据,带f前缀的从指定流读取数据。不带f前缀的函数不推荐使用,因为它不指定缓冲区大小,会导致溢出。
定位标准io流有三种不同的方式