Linux 系统编程导读 - 简介

说是Linux系统编程一书的导读,其实只是对Linux系统编程的学习笔记吧。系统编程其实说到底就是借用操作系统所提供的API进行一些底层功能性的操作,并在使用的过程中尽可能去了解其工作的原理。看了一下目录,主要分为以下几个部分:
文件的操作(I/O); 进程; 内存; 信号; 时间。也就主要分为这几个部分来学习学习。尽可能使用简短的语言以及实际的例子来描述。

简介

按照 1.4 Linux编程概念来描述

文件

文件描述符fd,我们平时在使用Linux C的open函数来打开一个文件的时候,就会返回一个整数值;

1
int open(const char *path, int oflag, ... );

该整数值就是文件描述符了。在使用open打开文件后,就可以通过文件描述符来访问文件了。文件描述符是内核为了高效管理已打开的文件所创建的索引;程序启动时,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。
对于用户程序进程来说,每一个进程都会有自己所对应的一个文件描述符表来对文件描述符进行管理。
参考:http://blog.csdn.net/cywosp/article/details/38965239

  1. 文件描述符怎样和实际文件对应?
    既然通过一个文件描述符能够访问到文件,那么该文件描述符必须能够对应到实际的文件,很容易想到一种解决方法就是建一个对应的表,索引key就是文件描述符,然后value就是文件,这样就能够很容易形成对应,也能够通过文件描述符访问到实际的文件了。
    Linux的做法也是类似于这种思想,首先进程会有自己的一个文件描述符表,这个表即表示该进程打开的文件;内核对所有打开的文件建一个统一的表来进行管理(猜测主要是为了对信息相同的打开文件只存储一条记录,减少消耗),进程的文件描述符表指向统一的表,这个统一的打开表会记录打开文件的详细信息,包括打开的方式(W/R)、文件的类型等等;我们比较关心的是包含一个inode指针,指向一个inode表。
    inode(information node)表中的每条记录,包含一个文件的基础信息,如在磁盘中的位置等,用它来唯一标识一个实体的文件,并通过它来访问到一个实体的文件。

目录和链接

用户直接通过inode来访问文件的不方便性,因此引入了 “目录” 的概念,目录用于将访问文件的名字和inode编号进行映射;名字和inode的配对称为链接。
当用户请求打开a.txt时,会在文件名指定的目录下面搜索该文件,找到该文件后,对应找到其inode编号,从而得到其inode。
该书给了一个例子,当用户请求访问 /home/blackbeard/landscaping.txt时,对应每一个目录(常说的文件夹),也将对应一个inode;那么找到landscaping.txt的顺序为:首先是在根目录 “/“下面搜索,找到home以及对应的inode,跳转到该位置;继续在该目录下搜索blackbeard,找到其对应的inode,跳转;最后在该目录下找到landscaping.txt并索引得到其对应的inode,从而找到文件。
这里包括两个概念,假设在一个文件夹下面创建一个文件,那么将会创建一个文件名到inode的映射,称之为链接(link);删除该文件时将会解除链接,称之为删除链接(unlink)。

硬链接

如果需要多个文件名链接到一个数据时,就需要用到硬链接了。这个一般用于保护重要的数据,假设有个重要的数据,我们可以为其创建一个硬链接,然后再去访问,就算误删除了该文件,也可以通过创建的硬链接访问到数据;(ln 1.txt 2.txt #为1.txt创建链接2.txt)
硬链接为了支持多个不同的文件名链接到一个inode,即两个不同的文件名,但是指向同一个磁盘数据;那么一个问题就是当删除一个之后,另一个也是能够访问到数据的,所以删除一个之后,不能够执行删除inode;所以inode添加了一个成员变量,链接计数,表示链接到该inode的文件名数量,当为0时就可以删除了。类似于浏览器中常见的引用计数。

软链接(符号链接)

类似于常说的快捷方式,它并不是直接链接到实际的inode数据;而是包含另一个文件的位置信息。所以点击符号链接时,首先对其进行解析找到原始文件名的位置,然后再通过该位置找到inode。(ln -s 1.txt symbolicLink)
值得一提的是,就算没有1.txt,也是能够创建symbolicLink的,只是在访问的时候,找不到位置下的文件而已。
硬链接、软链接详细可参考: http://blog.csdn.net/u013777351/article/details/50557260

特殊文件

块设备文件、字符设备文件、命令管道、Unix域套接字

文件系统与命令空间

详见:https://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/index.html

进程和线程

进程的管理:Linux中进程有一个严格的层次结构,进程树;进程树的第一个进程,init进程为根,新进程通过fork创建,新进程为调用fork的进程的子进程。需要注意的是,如果父进程在子进程前终止,那么内核将指定init进程为其父进程;就是说当父进程结束后,子进程也可以正常执行。如果一个进程终止后,不会立即从系统中移除,内核将在内存中保存进程的部分内容,允许父进程查询该进程是否处于终止的状态,确定终止后才会完全删除。
僵尸进程:如果一个进程处于终止状态,但其父进程尚未获知它的状态。

用户、组和权限

可以看成用于权限的管理,我们平时使用Linux的时候,对于一个文件或者一个文件夹,在它的属性中能够看到其所属于的用户以及用户组,以便给予相应的权限。

1
2
varas@varas-virtual-machine:~$ ls -l ./a.txt 
-rw-rw-r-- 1 varas varas 0 9月 20 11:37 ./a.txt

可以看出,该文件所属于的用户和用户组都是varas,对应于左边的三组权限,分配是用户、用户组、其他用户的权限。
进程也有对应的管理,每一个进程与一个用户ID关联,用于识别运行这个进程的用户

Linux 系统编程导读 - 文件I/O idapython
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×