date: 2017-10-13 16:17:28 title: 「理解Unix进程」读书笔记

百度脑图 - 理解UNIX进程: http://naotu.baidu.com/file/8945ac178c9961cda97a17a44de511ad?token=1447b9bed19693b2

图灵社区 - 理解UNIX进程: http://www.ituring.com.cn/book/1081

知道如何使用计算机,但对于计算机的工作原理却一无所知; 对工作原理有了深入的了解之后,可以更快地 理解并诊断出现的问题

能力越大,责任也越大

用户空间(userland)和内核

系统调用

manpages

所有的代码都是在进程中执行的

进程皆有标识 pid

常常会在日志文件中发现pid

进程皆有父 ppid

进程皆有文件描述符

文件描述符代表打开的文件

Unix哲学:在Unix世界中,万物皆为文件

文件描述符只是用来跟踪打开的资源

每个Unix进程都有三个打开的资源,它们是标准输入(STDIN)、标准输出(STDOUT)和标准错误(STDERR)

进程皆有资源限制

内核为进程施加了某些资源限制

软限制与硬限制

sysctl(8)

进程皆有环境

环境变量

系统调用不能直接操作环境变量

进程皆有参数

argv是argument vector

ENV并不是Hash

ARGV只是一个Array

进程皆有名

两种运作在进程自身层面上的机制可以用来互通信息。一个是进程名称,另一个是退出码。

进程皆有退出码

另一种结束进程的方法是使用一个未处理的异常

进程皆可衍生

进程从父进程处继承了其所占用内存中的所有内容,以及所有属于父进程的已打开的文件描述符

竟然同时执行了if语句的if和else代码块

其实也可以通过block来使用fork

守护进程

与脱离终端会话的进程进行通信

Unix信号

写时复制(copy-on-write,CoW)

进程可待

即发即弃(fire and forget)

看顾(Babysitting)

竞争条件(race conditions)

master/worker

僵尸进程

Good Things Come to Those Who Wait。

进程皆可获得信号

信号投递是不可靠的

任何一行代码都能够被信号中断

信号是一种异步通信

(1) 忽略该信号 (2) 执行特定的操作 (3) 执行默认的操作

信号由内核发送

重定义信号

忽略信号

捕获一个信号有点像使用一个全局变量

如果进程在接收到一个信号的同时还在处理其他的信号

进程皆可互通

进程间通信(简称IPC)

管道和套接字对(socket pairs)。

共享管道

有自己的文件描述符以及其他的一切,因此也可以与子进程共享。

流与消息: 没有开始和结束的概念。

之后跟着一些特定协议的分隔符(delimiter)

远程IPC: TCP RPC 分布式系统

管道和套接字都是对进程间通信的有益抽象。

守护进程是在后台运行的进程,不受终端用户控制

首个进程

进程组和会话组

会话组是更高一级的抽象,它是进程组的集合

/dev/null

生成终端进程

除非你真的需要,通常我们都会避免传递字符串,而是尽可能地传递数组。

与Unix进程打交道事关两件事:抽象和通信。