本人学习Linux系统编程与网络编程时的路线:
Linux系统编程
- Linux中用于文件IO的系统调用API
- Linux中的文件系统
- 进程及进程间的通信
- 多线程及线程间的同步与异步
Linux网络编程
- 基本的网络知识:TCP,UDP
- Socket相关API
- 多进程并发服务器模型
- 多线程并发服务器模型
- IO复用服务器模型
高并发服务器框架
- tinyHttpd
- Libevent
- Nginx
-----------------------------------------------------我叫分割线---------------------------------------------------------
1.每打开一个进程,都会在内核空间中创建一个PCB(struct task_struct),PCB中包含很多内容,其中有一个文件描述符表,文件描述符表记录着当前进程打开的所有文件。进程每打开或者创建一个文件都会在内核空间中生成一个file结构体(位于PCB之外的内核空间),该file结构体包含了文件标志flags、文件读写位置、指向文件位置的指针等文件信息。而文件描述符(file description,fd)所对应的file指针指向此file结构体。所以串联起来,fd是文件的唯一性标识,对于文件的操作就变成了对于fd的操作。
- 因为每打开一个文件都会在内核空间中生成一个file结构体,所以当前进程可打开的文件个数是有限制的,Linux下默认是1024个,也就是fd为0~1023。在关闭文件时就会释放掉file结构体。
- Linux中,每一个进程都默认打开三个文件描述符:标准输入0,标准输出1,标准错误2。新打开一个文件返回的是文件描述符表中未被使用的最小的文件描述符,也就是从3开始。
2.系统调用的文件IO和标准C中的文件IO有何区别?(系统调用和标准C库函数有何区别?)
- 从外在形式上或者说使用者角度来看,它们都是以C函数的形式出现的。但是却有着根本的区别。
- 系统调用的文件IO在用户空间中没有缓冲区,是更底层的接口,作为直接进入内核的入口点。位于用户空间和内核空间之间,有一部分在用户空间中运行,有一部分在内核空间中运行。
- 标准C中的文件IO,在用户空间中是有缓冲区的,大部分位于用户空间中,不是内核的入口点。系统调用的文件IO通常提供一种最小接口,而标准C中的文件IO通常提供比较复杂的功能,实际上是对系统调用文件IO的封装。
- 应用程序既可以调用系统调用文件IO也可以调用标准C的文件IO。另外,如果希望的话,我们可以替换标准C的文件IO,但是系统调用文件IO通常是不能替换的。比如,标准C中的文件IO只能用于普通文件,而管道文件,套接字文件,设备文件等必须要使用系统调用IO。
- 其实系统调用IO在内核空间中是有一个缓冲区的,缓冲区的目的是减少磁盘IO,减少对于硬件物理存储设备的访问,提高效率。
3.常用于文件IO的系统调用API。
4.进程之间,用户空间是独立的,但是内核空间是共享的。
PS:本文章是结合自己所学进行的整理和总结,希望能给初学Linux系统编程与网络编程的小伙伴带来帮助~后续内容敬请期待~