UNIX 提供了两个函数用于创建新进程
#include <unistd.h>
pid_t fork(); /* 子进程中返回0,父进程中返回子进程ID,出错返回-1 */
pid_t vfork(); /* 子进程中返回0,父进程中返回子进程ID,出错返回-1 */
#include <sys/wait.h>
/* 若成功则返回进程 ID:0,若出错则返回 -1 */
pid_t wait(int* status);
pid_t waitpid(pid_t pid,int* status,int options);
参数 status 可以为空指针,表示不关心终止状态
在 <sys/wait.h> 中有定义四个宏来获取进程终止的原因
子进程是否正常终止,若为真,则可以通过宏 WEXITSTATUS(status) 来获取退出的状态码
子进程是否因收到一个不可捕获的信号而异常退出,若为真,可以通过 WTERMSIG(status) 获取信号编号,某些系统可以通过 WCOREDUMP(status) 判断是否产生 core 文件
子进程是否处于 stop 状态,若为真,则可以通过 WSTOPSIG(status) 来获取使子进程暂停的信号编号
子进程是否处于 continue 状态
通过设置 options 参数,waitpid 不一定等到子进程退出来能获取子进程的状态,也能在子进程处于 stop 或 continue 状态时返回子进程的状态
waitid 可以指定要监控的子进程的哪些状态变化
#include <sys/wait.h>
int waitid(idtype_t idtype,id_t id,siginfo_t* infop,int options);
1、exec 实际执行的并不是该脚本文件,而是脚本文件第一行 #! 解析器程序 可选参数项 中的 解析器程序
2、exec 传递给该解析器程序的参数顺序为,解析器地址,可选参数,脚本文件地址,除 argv0 外的由 exec 函数传入的其他参数
/*
/tmp/testinterp的内容为:
#! /usr/bin/echo.exe args:
*/
#include <unistd.h>
int main(){
execl("/tmp/testinterp","testinterp","myarg1","MY ARG2",(char*) 0);
}
args: /tmp/testinterp myarg1 MY ARG2
大多数 UNIX 系统都提供了一个选项以进行进程会计(process accounting)处理,启用该选项后,每当进程结束时,内核就写一个会计记录
会计记录是在 fork 时产生而不是 exec 时产生 但 exec 会改变响应记录中的命令名,而且 AFORK 标志也会被清除
会计记录一般为二进制格式的,且结构各个系统实现的都不一样,一般可以在 <sys/acct.h> 中查到 struct acct
root 用户可以使用 accton 命令行来对命令行开启进程会计选项
任何进程都可以通过调用 times 函数获得自己的运行时间,用户态 CPU 时间和内核态 CPU 时间
#include <sys/times.h>
/* 若成功返回进程相对上一次运行 times 函数的运行时间,单位为时钟滴答数,若出错返回 -1 */
clock_t times(struct tms* buf);
struct tms{
clock_t tms_utime; /* user CPU time */
clock_t tms_stime; /* system CPU time */
clock_t tms_cutime; /* user CPU tim, terminated children */
clock_t tms_cstime; /* system CPU time, terminated children */
}
