28 进程的创建和执行过程
记账
记账功能打开后,系统会在每个进程结束后记录一条账单信息。标准工具 sa(8) 对账单文件进行汇总,lastcomm(1) 则就先前执行的命令列出相关信息。
Tip
Linux 系统的进程记账功能属于可选内核组件,可以通过 CONFIG_BSD_PROCESS_ACCT
选项进行配置。 在 Debian 上,需要使用 apt install acct
来安装(否则 man 8 sa
和 which lastcomm
都找不到)。
特权进程可以使用 acct
系统调用来打开或关闭记账功能,应用程序则很少使用到这种调用。
系统调用 clone()
clone()
的地位和 fork()
、vfork()
一样,它们在内核中都是用 do_fork()
来实现的,但是它能支持比后两个函数更加精细的控制,因此也被用作线程实现的方式。我们一般使用的 clone()
是 glibc 的包装函数,它和内核提供的 SYS_clone 系统调用有一点差异。
/* Prototype for the glibc wrapper function */
#define _GNU_SOURCE
#include <sched.h>
int clone(int (*fn)(void *_Nullable), void *stack, int flags,
void *_Nullable arg, ... /* pid_t *_Nullable parent_tid,
void *_Nullable tls,
pid_t *_Nullable child_tid */ );