Linux 小知识点
UNIX 时间戳一般是 32 位,从 1970.1.1 开始算起,以秒计时。(注意 WINDOWS sleep 函数以毫秒计时,而 Linux 的 sleep 函数以秒计时)
Linux 文件描述符(注: Linux 几乎把一切都看作是文件)
系统为了维护文件描述符,建立了三个表。(文件描述符表(进程级)、打开文件表(系统级)、i-node 表(系统级))
每个进程的0、1、2默认文件描述符都是标准输入、标准输出、标准错误。
可以通过
dup()
等相关函数修改文件描述符的文件指针。fork()子进程会从父进程继承打开文件表(使用自己进程的文件描述符指向与父进程相同的打开文件表项)。
文件偏移量指针(read、write时的定位)以及一些状态标志和访问模式等信息都存储在打开文件表里。
有可能几个进程的文件描述符指向一个打开文件表项,也可能几个打开文件表项指向一个 i-node 表项。
inode 存储了真正的文件信息(除了文件名字)。并且文件通过唯一的 inode 号码进行识别,文件名只是 inode 号码的别称。硬链接(
ln [源文件] [目标文件]
)便是多个文件名指向同一个 inode 号码的体现;软连接(ln -s [源文件] [目标文件]
)相当于是在一个新的文件内存储了被连接的文件的路径。(目录也是文件)
注:正是由于 Linux 文件名和 inode 的独立关系造成了 Linux 没有 Windows 的一些烦恼:比如,可以删除正在运行的文件(
rm
只删除了文件名,内存和 inode 文件还存在);还可以在不关闭软件的情况下进行更新。因为系统通过 inode 号码识别运行中的文件,而不是通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。