Unix环境高级编程学习笔记整理

来源:互联网 发布:win8电脑屏幕录制软件 编辑:程序博客网 时间:2024/04/30 02:16

第3章 文件I/O

对内核而言,所有打开的文件都能通过文件描述符引用。(建立好链接的套接字描述符在unix系统使用文件描述符实现的)。

内核使用三种数据结果表示打开的文件。
(1)每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件的描述符表,每个描述符占用一项。表中的每个文件描述符包含:①文件描述符标志②指向一个文件表项的指针。
(2)内核为所有打开文件维持一张文件表。每个文件表项包含:
文件状态标志(包含读写,填写,同步,非阻塞等)
当前文件偏移量
指向该文件v节点表项的指针。
(3)每个打开的文件都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包括了该文件的i节点。这些信息是再打开文件时从磁盘上读入内存的。这些文件都是从磁盘读入内存的,所以可以快速使用这些参数。

note:linux没有使用v节点,而是使用了通用的i节点。



多个进程打开同一个文件的情况如下图(fork的另一个特性是所有由父进程打开的描述符都被复制到子进程中。父子进程中相同标号的文件描述符在内核中指向同一个file结构体,也就是说,file结构体的引用计数要增加。):


第4章 文件和目录

我觉得这一章中最主要的就是stat结构了(stat结构大多数取自i节点):

struct stat {        mode_t     st_mode;       //文件对应的模式,文件,目录等        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;      //文件状态改变时间        blksize_t st_blksize;    //文件内容对应的块大小        blkcnt_t   st_blocks;     //伟建内容对应的块数量      };

第5章 标准I/O库

相当于在内核io上加了一层包装。

第7章 进程环境

C程序的存储空间布局(进程地址空间布局)


void do_line();int a=0; //初始化数据段 包含c程序中出现在函数之外的声明,带有初值的变量。int b; //未初始化数据段main(){int b;//栈,在main栈帧中char s[]="abc"; //栈static int c=0; //初始化数据段pl=(char*)malloc(10); //堆 在堆中进行动态存储分配}do_line(){int a;//栈,在do_line栈帧中}

栈由编译器自动分配释放,操作方式类似数据结构中的栈,栈帧顺序从高地址往下。

堆一般由程序员分配释放,堆从低地址往上。

递归函数每次调用自身时,就是用一个新栈帧,因此一个函数调用实例中的变量集不会影响到另一个函数调用实例中的变量。

第8章 进程控制

当运行一个程序时,操作系统需要创建一个进程,这个进程的虚拟内存空间与前一页的“c程序存储结构”映射起来。可执行程序并非真正读到物理内存,只是链接到进程的虚拟内存中。


当进程所需要的数据或内容未在物理内存中时,则可以根据页表机制将其换进来(这里终于跟操作系统的内存管理联系起来了)

exec函数:当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行(其实就是地址空间的变化呗)

fork函数:


父进程和子进程根据不同内核调度算法,返回顺序不确定。

子进程获取父进程数据空间,堆和栈(其实就是虚拟内存空间),物理内存并不复制,但如果有进程修改物理内存中的内容时,则复制出新的页,称为“写时复制”。

fork两种常见用法:

(1)一个父进程希望复制自己,常见于网络服务进程。

(2)一个进程要执行一个不同程序。(子进程从fork返回后立即调用exec)。