28.1 进程记账
打开进程记账功能后,内核会在每个进程终止时将一条记账信息写入系统级进程记账文件。
这条账单记录包含了内核为该进程所维护的多种信息,包含终止状态以及进程消耗的CPU时间。
打开和关闭进程记账功能
一般将相应命令置于系统启动脚本中,在系统每次重启时打开进程记账功能
参数为记账文件的路径名,若为NULL则关闭记账功能。
** 进程记账记录**
一旦进程终止,就会有一条acct记录写入记账文件。
ac_flag:该字段是为进程记录多种事件的位掩码。
ac_comm: 记录了该进程最后执行的命令名称。
ac_exitcode字段保存着进程的退出状态。
进程记账文件格式(版本三)
与前版本唯一差别是,写入记账文件的记录格式不同。
以下是主要差别:
28.2 系统调用clone()
类似于fork()和vfork() , linux特有的clone() 也可以创建一个新进程。
与前者不同的是,clone在进程创建期间对步骤的控制更加精准(但可移植性不强)
与fork不同的是,克隆生成的子进程继续运行时不以调用处为起点,转而去调用以参数func所指定的函数,func又称为子函数。
当func函数返回,或是调用exit()之后,克隆产生的子进程就会终止。
调用者必须分配一块大小适中的内存空间供子进程的栈使用,同时将这块内存的指针置于参数child_stack中。在大多数硬件架构中,栈空间的增长方向是向下的,所以参数child_stack应当指向所分配的内存块的高端。
参数flags服务于双重目的。低字节中存放着子进程的终止信号,子进程退出时其父进程将收到这一信号。剩余字节则存放位掩码,用于控制clone()的操作。
clone() 的余下参数分别是:ptid,tls 和 ctid,这些参数与线程的实现相关,尤其是在针对线程ID以及线程本地储存的使用方面。
28.4 exec()和fork()对进程属性的影响