1. Linux系统编程的3大基石:系统调用、C库、C编译器
调用系统调用:位于用户空间的应用程序无法直接访问内核空间。从安全性和可靠性角度考虑,也需要禁止用户空间的程序直接执行内核代码或操纵内核数据。但从另外一个角度看,内核也必须提供这样一种机制,当用户空间的用户希望执行系统调用时,可以通过该机制通知内核。有了这种机制,应用程序就可以“深入内核”,执行内核允许的代码。
2. Linux 编程的概念
2.1 文件
文件是Linux系统中最基础最重要的抽象。文件必须先打开才能访问。文件打开后是通过文件描述符来引用,该描述符是从打开文件关联的元数据到文件本身的映射。与文件关联的是索引节点inode,索引节点中会保存和文件相关的元数据,如文件修改时间戳、所有者、类型、长度以及文件数据的位置——但不包含文件名。
文件通常通过文件名从用户空间打开,目录是可读名称到索引编号之间的映射。名称和索引节点之间的配对称为链接(link)。
硬链接:当不同名称的多个链接映射到同一个索引节点时,我们称该链接为硬链接(hard links)。要从目录中删除文件,需要从目录结构中取消链接(unlink)该文件,为了确保在删除所用的链接之前不会删除文件,每个索引节点包含链接计数(link count),记录该索引节点在文件系统中的链接数。当unlink某个路径时,其链接计数会减1;只有当链接计数为0时,索引节点及其关联的数据才会从文件系统中真正删除。
符号链接:符号链接类似于普通文件,每个符号链接有自己的索引节点和数据块,包含要链接的文件的绝对路径。
特殊文件:Linux只支持四种特殊文件:块设备文件、字符设备文件、命名管道以及UNIX域套接字。字符设备是作为线性字节队列来访问,块设备是作为字节数组来访问,命名管道是以文件描述符作为通信信道的进程间通信(IPC)机制,它可以通过特殊文件来访问。普通管道是将一个程序的输出以“管道”形式作为另一个程序的输入,普通管道是通过系统调用在内存中创建的,并不存在于任何文件系统中。命名管道和普通管道一样,但是它是通过FIFO特殊文件来访问的。套接字(socket)是最后一种特殊文件,支持不同进程间的通信,包括UNIX域套接字,UNIX域套接字使用文件系统上的特殊文件进行交互,该文件称为socket文件。
2.2 进程
进程是执行时的目标代码:活动的、正在运行的程序。