总结自《Linux-UNIX 系统编程手册》

  • shell 一般在用户登陆后会自动创建一个 login shell,shell 本身只是一个用户进程
  • Linux 中的角色的设计包括用户,组和超级用户
  • 文件类型:普通文件、设备、管道、套接字、目录以及符号链接
  • I/O 系统调用使用文件描述符—(往往是数值很小的)非负整数—来指代打开的文件。 获取文件描述符的常用手法是调用 open(),在参数中指定 I/O 操作目标文件的路径名。通常,由 shell 启动的进程会继承 3 个已打开的文件描述符:描述符 0 为标准输入,指代为 进程提供输入的文件;描述符 1 为标准输出,指代供进程写入输出的文件;描述符 2 为标准 错误,指代供进程写入错误消息或异常通告的文件。
  • 过滤器:cat、grep、tr、sort、wc、sed、awk
  • 逻辑上将一个进程划分为以下几部分(也称为段):文本,数据,堆,栈
  • 进程可使用系统调用 fork() 来创建一个新进程。使用系统调用 execve()去加载并执行一个全新程序。execve()会销毁现有的文本段、数据段、栈段及堆段,并根据新程序的代码,创建新段来替换它们。
  • 每一进程都有一个唯一的整数型进程标识符(PID)。此外,每一进程还具有一个父进程 标识符(PPID)属性,用以标识请求内核创建自己的进程。
  • 可使用以下两种方式之一来终止一个进程:其一,进程可使用_exit()系统调用(或相关的exit()库函数),请求退出;其二,向进程传递信号,将其 “杀死”,无论以何种方式退出,进程 都会生成“终止状态”,一个非负小整数,可供父进程的 wait()系统调用检测。
  • 每个进程都有一组与之相关的用户 ID (UID)和组 ID (GID):真实用户 ID 和组 ID,有效用户 ID 和组 ID,补充组 ID。
  • 系统引导时,内核会创建一个名为 init 的特殊进程,即“所有进程之父”,该进程的相应 程序文件为/sbin/init。系统的所有进程不是由 init(使用 frok())“亲自”创建,就是由其后代 进程创建。init 进程的进程号总为 1,且总是以超级用户权限运行。谁(哪怕是超级用户)都 不能“杀死”init 进程,只有关闭系统才能终止该进程。init 的主要任务是创建并监控系统运 行所需的一系列进程。
  • 守护进程:通常在系统引导时启动,直至系统关闭前,会一直“健在”,在后台运行,且无控制终端供其读取或写入数据。
  • 每个进程都有一份环境列表,即在进程用户空间内存中维护的一组环境变量。这份列表 的每一元素都由一个名称及其相关值组成。由 fork() 创建的新进程,会继承父进程的环境副本。
  • 使用系统调用 setrlimit(), 进程可为自己消耗的各类资源设定一个上限。此类资源限制的每一项均有两个相关值:软限制 (soft limit)限制了进程可以消耗的资源总量,硬限制(hard limit)软限制的调整上限。
  • 调用系统函数 mmap()的进程,会在其虚拟地址空间中创建一个新的内存映射。
  • 内存映射分为两类:
    文件映射:将文件的部分区域映射入调用进程的虚拟内存。映射一旦完成,对文件映射 内容的访问则转化为对相应内存区域的字节操作。映射页面会按需自动从文件中加载。
    匿名映射,其映射页面的内容会被初始化为 0。
  • 由某一进程所映射的内存可以与其他进程的映射共享。达成共享的方式有二:其一是两个 进程都针对某一文件的相同部分加以映射,其二是由 fork()创建的子进程自父进程处继承映射。
    当两个或多个进程共享的页面相同时,页面内容修改的可见性取决于创建映射时所传入的标志参数。
    传入标志为私有,则某进程对映射内容的修改对于其 他进程是不可见的,而且这些改动也不会真地落实到文件上;若传入标志为共享,对映射内容 的修改就会为其他进程所见,并且这些修改也会造成对文件的改动。
  • 静态库:要使用静态库中的函数,需要在创建程序的链接命令中指定相应的库。主程序会对静态库中隶属于各目标模块的不同函数加以引用。链接器在解析了引用情况后,会从库中抽取所需目标模块的副本,将其复制到最终的可执行文件中,这就是所谓静态链接。
  • 共享库:如果将程序链接到共享库,那么链接器就不会把库中的目标模块复制到可执行文件中,而是 在可执行文件中写入一条记录,以表明可执行文件在运行时需要使用该共享库。一旦在运行时将 可执行文件载入内存,一款名为“动态链接器”的程序会确保将可执行文件所需的动态库找到, 并载入内存,随后实施运行时链接,解析可执行文件中的函数调用,将其与共享库中相应的函数 定义关联起来。
  • 进程间通信(IPC)机制:信号,管道(亦即 shell 用户所熟悉的“|”操作符)和 FIFO,套接字,文件锁定,消息队列,信号量,共享内存。
  • shell 执行的每个程序都会在一个新进程内发起。
  • 会话指的是一组进程组(任务)。在任一时点,会话中总有一个前台进程组(前台任务),可以从终端中读取输入,向终 端发送输出。一 个会话可以拥有任意数量的后台进程组(后台任务),由以“&”字符结尾的行命令来创建。
  • 伪终端广泛应用于各种应用领域,最知名的要数 telnet 和 ssh 之类提供网络登录服务的应 用,以及 X Window 系统所提供的终端窗口实现。
  • 进程涉及两种类型的时间:真实时间,进程时间。
  • /proc 文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数 据结构的接口。这为查看和改变各种系统属性开启了方便之门。此外,还能通过一组以/ proc/PID 形式命名的目录(PID 即进程 ID)查看系统中运行各进程的相关信息。