TLPI(liunx/unix系统编程手册)初读笔记

当然我只是记录一下我初读这本书的想法和我自己不懂该记下的地方,其他的地方就不一一论述,全部记下来就没有意思了。

若有什么错误,望大家指出,谢谢 ~ 希望有评论 ~

——————————————————————————————————————————————————————————————————

前言就是明确的介绍书的目的编程标准等等。。source code 在 http://man7.org/ 大家可以去参阅

一章介绍 POSIX 标准和一些历史发展。

二章开始介绍基本概念:

  讲到了内核的功能:1. 提供了文件系统。2. 创建和终止进程。3. 对设备的访问。4. 联网。5. 提 API。

  读到 -- 以进场及内核视角检视系统 -- 的时候,我就有醍醐灌顶的感觉,需要我们用内核的视角来看问题。进程不知道它何时何地的发生调度,又不知道自己在 ram 的位置,要知道进程本身是一个不知情的,也无法创建出子进程,书上说笑,哪怕是自行了断都不行。。。(哈 哈 哈  好冷——!)相对的,内核就是神一般的存在,进程的所有事情都是由内核调度的 ,那些“某进程创建另一个进程”这句话都是不对的。

  谈到文件系统时候,文件包括设备,管道,套接字,目录,符号链接(以前都不知道。。)

    目录,内容采用表格的形式,数据项包括文件以及相应文件的引用。文件名 + 引用 ——> 链接

    有别于链接,有符号链接。文件名 + 指针。那么就有了软连接和硬连接这两概念 ~

  文件 io。对于所有文件,都有(open,read,write,close)等操作,文件描述符与 stdin,stdout,stderr,要了解 c 语言的 io 库函数。

  程序,知道了什么是 int main(int argc, char *argv[])  醉了。。。

    进程,内核将其代码载入虚拟内存,分配空间,建立 bookkeeping。进程的内存布局:文本,数据,堆,栈。

——————————————————————————————————————————————————后续 23:34:432017-03-09

    创建进程和执行进程,调用 fork() 函数的是父进程,子进程继承父进程的段,栈堆数据,并可以修改,子进程可以使用 execve()函数创建一个全新的程序,销毁数据创建新段。

    杀死进程的两种方式。一,_exit() 函数(或相关库函数),并指明自己的终止状态。二。向进程传递信号。根据 kill 的信号类型设置种植状态。

    能力(cap),赋予进程执行某操作的特权,又防止其执行其他的特权机操作。。

    环境列表。每个进程都有一个环境列表,即在进程用户空间内存中维护的一组环境变量(名称 + 相关值)。fork 创建的子进程继承父进程,这为父子进程通信提供一种机制,相对于 fork,execve 就有两种方式,一种是继承,一种是在 exec()参数中指定。

    资源限制。hard limit - soft limit  <--setrlimit(),硬限制是软限制的顶,通过 setrlimit 来设置。还有相关的 ulimit 函数。

 ———————————————————————————————————————2017-03-1222:44:51

  内存映射:

      调用 mmap() 进程,会在虚拟地址空间中创建一个新的内存映射。有两类:文件映射和与之对应的匿名映射。

      达成映射有两种方法:两个进程对某文件相同部分加以映射;有 fork 创建的父子进程不同的改动的可见性由该进程的标志参数决定的分为私有和共享。

      当然,内存映射的用途有很多:以可执行文件的相应段来初始化文本段、内存(填 0)的分配,文件 io(映射内存 io)、进程间通信(通过共享映射)。

  静态库和共享库

      http://blog.csdn.net/sunshinewave/article/details/39155755

      参考上面的大神的文章,大概的我有一些了解了,在程序运行之前就链接到程序的是静态库(静态链接),是直接注入程序的,反复利用时会占有大量磁盘空间。动态库则是在程序中加入标记,执行时由“动态链接器”把库要的函数调入内存,在运行时,共享代码在内存中只需保留一份,可供所有内存使用。,从而节省了空间。

  IPC 和同步:

      liunx 有相关的机制:信号,管道(|),套接字,文件锁定,消息队列,信号量,共享内存。

  信号:

      采用不同的整数标识各种信号类型,并以 SIGXXXX 形式的符号加以定义。当然程序可以不理睬信号(信号屏蔽)或者是建立信号处理器。

  线程:

      可将线程想象为共享同一虚拟内存及一干其他属性的进程,每个线程都有不同的栈有相同的代码段和堆。借助于线程 API 所提供的条件变量和互斥机制尤其是在共享变量的使用方面更为容易。易于多处理硬件并行处理。

  略

  伪终端:

      ssh,telnet;

  liunx 下的 /proc 文件系统:

      虚拟问及爱你系统这为查看和改变各种系统属性开启了方便之门。

——————————————————————————————————

这是学习 liunx 系统编程的基本概念。2017-03-1915:10:08