1,进程标识符的 延迟重用算法:

使得赋予新进程的ID不同于最近终止进程所用的ID,这防止了将新进程误认为是使用同一ID的某个已终止的先前进程。

2,特殊进程

ID为0的进程 是调度进程, 常被称为交换进程,是内核的一部分。

ID为1的是init进程, init会称为所有孤儿进程的父进程。

3,实际用户ID 和 有效用户ID

实际用户ID,表明我们是谁, 有效用户ID 通常是实际用户ID, 有效用户ID 决定了我们的文件访问权限。

当 设置了  “设置用户ID”位 后, 有效用户iD,则会变成 该执行文件所有者的 ID。  比如passwd这个文件所有者是root, 你用work账号登陆进来, 但passwd这个文件 设置了 设置用户ID位, 所以你work账户 执行 passwd的时候,他会把你当成root一样。  这个有点像 圣旨一样, 见到圣旨就跟见到皇上本人一样, 要下跪, 虽然常常是公公拿着在读。 说明这个 圣旨 就设置了 “设置用户ID位”。   设置的方法可以是  chmod +s filename    ,当你查看文件性质的是, 原本的 rwx 会 变成 rws , 这里的s 就是由x变过来的。 但有时候会看见 大写的S,这说明该文件尚且没有 可执行权限x。 

4,fork

fork()调用一次,会返回两次, 在子进程中,返回值是0 ,在父进程中,返回的是新创建的 子进程的进程ID。

一个进程可以有多个子进程。 一个子进程只有一个父进程(伦理关系)。 子进程可以通过 getppid 来找到父进程。

父子进程不同享存储空间, 父子进程共享 正文段。

如果要求 父子进程同步 ,则要求某种形式的进程间通信。

5,C程序的 存储空间布局

正文段                      CPU执行的机器指令部分

初始化数据段          初始化的全局变量

未初始化数据段      未初始化的全局变量

栈                             函数中的变量,函数调用时的信息

堆                             动态存储分配的部分 malloc

6,strlen 和 sizeof

strlen计算不包含 null字节的字符串长度,

sizeof 计算包括终止null字节的缓冲区长度。

另一个差别是 strlen需要进行一次函数调用, sizeof在编译时就计算了缓冲区的长度。

7,fork 

fork子进程时候,会复制父进程的缓冲区,如果这时候缓冲区有未刷新的东西,也会一并复制到子进程中。  有时会造成 终端打印 和 重定向到 文件中的 内容不一样。 文件中的多了一次,  原因是标准IO  对于终端 是 行缓冲,而文件是 全缓冲。 这样可能就在fork的时候,复制了两份 打印内容 。

8,如何不wait 子进程,而且能保证子进程退出后,不会成为僵尸进程。

把他变成 孙子。 让孙子的老爸是init。

9,1百万行的数字,占多大空间

如果是一个5位数的话, 加上换行, 每一行是6个字符。 一百万行就是600W字节。 占空间大约是6M。 

10,进程组,组长进程的标志是 进程组ID 等于 其进程ID。