笔者将《unix环境高级编程》主要内容总结为三篇:文件篇,进程篇,高级io和进程间通讯三大板块。本文是unix环境高级编程系列文章第一篇:文件篇。该篇主要包括:node
介绍了unix的体系结构,以及unix中的文件和目录,输入输出,程序和进程,信号等基本概念shell
标准包括C语言的标准和操做系统标准,实现包括BSD,FreeBSD,Linux,Solari,Mac os等数据库
包括文件描述符,对文件的打开,关闭,定位,读,写,改变文件属性操做。内核IO调用基于文件描述符。还介绍了文件的底层数据结构,了解数据结构以后就能理解文件是如何支持共享的编程
主要介绍文件的属性和属性对应的数据结构,以及各个字段控制的问访问权限,文件类型等。unix中一切皆文件,这些文件包括:普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字和符号连接。最后结束UFS文件系统。数组
标准io解决了内核io的不少细节问题,包括缓冲区分配。全部操做基于流和File对象缓存
最后介绍系统提供的一些数据文件,包括口令文件,阴影文件,朱文杰,登陆帐号文件,服务数据文件,协议数据文件,网络数据文件等bash
一般是一个小的非负整数,内核用它标识一个特定进程正在访问的文件服务器
每当运行一个新程序时,shell都为其打开三个文件描述符:网络
说明 | 文件描述符 | 头文件 | 宏 |
---|---|---|---|
标准输入 | 0 | <unistd.h> | STDIN_FILENO |
标准输出 | 1 | <unistd.h> | STDOUT_FILENO |
标准出错 | 2 | <unistd.h> | STDERR_FILENO |
进程控制的主要函数:fork,exec和waitpid数据结构
unix系统一直使用两种不一样的时间值
open(pathname, O_WRONLY|O_CREATE|O_TRUNC, mode)
复制代码
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流有三种不一样的方式