-
获取进程的相关标识符信息函数
-
fork函数
可以考虑几个问题:
子进程是否copy了父进程的所有内存等信息,没有的话是如何实现的
子进程和父进程的文件操作是怎么实现同步的,父子进程会文件共享,包括偏移量。如果不关闭文件操作符会发生什么
子进程和父进程有哪些是一样的,哪些是不一样的,考虑一下,利于理解 -
vfork函数,该函数和fork函数一样都会产生新的子进程,那么提出该函数的意义在哪,提高效率,vfork是为专门的场景服务的。vfork保证了子进程先运行。子进程在父进程的地址空间中运行
-
wait函数,等待进程正常或者异常结束,其包括下面几个函数,需要了解各个函数的作用:
-
exit函数,使得子进程或父进程终止,有5种正常终止状态,3种异常终止状态
僵死进程:一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的相关信息,释放其所占用的资源)的进程叫做僵死进程。ps将僵死进程的状态打印为Z,如何获取状态?调用wait等函数,也提供了避免僵死进程的方法。init进程的子进程终止时不会出现僵死进程。 -
竞争条件:当子进程和父进程中的程序需要按照顺序执行时,就出现了竞争条件。此时需要使用机制去告知对应的进程,此时在进程中可以使用信号机制去传递信号
(插入)有下列方式取消缓冲
-
exec函数,下面有七种不同的exec函数可供调用
-
进程更改用户id和组id
某些情况下,需要提高权限或者降低权限,可以使用setuid或者setgid等函数的方法来更改id -
进程会计
当一个进程结束之后内核会写一个会计记录,包括进程id,组id,内存、cpu信息等。使用acct函数禁止或者使用该进程会计,可以在/var/accout/pacct中读得这些信息。 -
用户标志
使用getlogin()函数可以得到用户登录终端的时候使用的用户名(守护进程获取不到)。 -
进程调度
使用nice,getpriority,setpriority等函数可以获得,设置进程的优先级,优先级越高的进程分配的资源比例越高。
二:
进程关系
12. 终端登录
需要了解BSD的登录流程
13. 网络登录
…
14. 进程组
每一个进程属于一个进程组,
pid_t getpgrp(void)得到该进程进程组
pid_t getpgid(pid_t pid)得到对应进程id对应的进程组
进程组id等于其进程组长的id
进程可以更改进入的进程组
int setpgid(pid_t pid, pid_t pid)将指定的进程转入指定的进程组,一个进程只能为它自己或它的子进程设置进程组ID
15 会话(session)
会话是一个或多个进程组的集合。
pid_t setsid(void)该函数不能由进程组中的首进程调用,该函数常用于创建守护进程中,创建一个会话。
-
控制终端
一个会话可以有一个终端,可以是终端设备,也可以是伪终端(网络登录),建立与终端连接的首进程称为控制进程,如果有控制终端则必有前台进程。
有三个函数通知内核,一个进程组哪些是前台进程组。 -
作业控制
作业控制要求有三种形式的支撑- 支持作业控制的shell
- 内核中的控制驱动程序必须支持作业控制
- 内核必须提供对某些作业控制信号的支撑。
-
孤儿进程组